I submitted the new benchmark result here:

Benchmark ResultGetter Method Only

https://gist.github.com/8cd230a5601cbe38439661adf3caca0d

Without getter optimization (3 runs):
151.0169506073ms

With getter optimization (3 runs)
39.201021194458ms
Template Engine Benchmark

https://gist.github.com/a23cf294dfcf74683b8f02d93a47bc5b

With getter optimization:
1118ms

Without getter optimization:
1235ms
Affect

Other Microbench result:
https://gist.github.com/c9s/0273ac21631562724cabf86c42e86e32

On Sat, Apr 2, 2016 at 11:29 AM, Lin Yo-An <cornelius.h...@gmail.com> wrote:

> Hi Xinchen Hui,
>
> The magic get method is not being optimized. This optimization only
> focuses on simple getter, which is used in a lot of OO-based appoications
> like Symfony or Drupal.
>
>
> Hi Dimitry,
>
> Thanks for reviewing the code, comments are helpful. :) could you explain
> a little bit of how runtime_cache_slot works?
>
>  I think adding the property_offset in op_array is kinda like a workaround
> for POC, and I want to remove it from op_array.
>
>
> Cheers, Yo-An
>
>
> Xinchen Hui <larue...@php.net> 於 2016年4月1日 星期五寫道:
>
> Hey:
>>
>> On Fri, Apr 1, 2016 at 4:35 PM, Lin Yo-An <cornelius.h...@gmail.com>
>> wrote:
>>
>>> Hi Dmitry, Nikita, Andrea
>>>
>>>
>>> My implementation now is able to get the property offset and fetch
>>> object property directly without invoking zend_std_read_property and
>>> pushing new call frame onto the stack.
>>>
>>> The current behavior:
>>>
>>> 1. In compile-time, the pass_two() function now marks the getter
>>> functions in op_array.accessor.type
>>>
>>> 2. When Zend Engine first time attempt to read the property, it saves
>>> the property offset in the accessor field and mark the method as a "getter".
>>>
>> I am not sure if I understand you correctly, but.. have you consider this
>> case?
>>
>> <?php
>> class A {
>>     private $a = 1;
>>     private $b = 2;
>>     public function __get($name) {
>>         static $is_first = 1;
>>         if ($is_first) {
>>             $is_first = 0;
>>             return $this->a;
>>         } else {
>>             return $this->b;
>>         }
>>     }
>> }
>>
>>
>> $a = new A();
>> echo $a->nomeaning;
>> echo $a->nomeaning;
>> ?>
>>
>> thanks
>>
>>>
>>> 3. When Zend Engine second time invoke the getter method, it checks the
>>> accessor field and try to read the property value directly instead a
>>> "method call"
>>>
>>>
>>>
>>> The implementation did some change:
>>>
>>> 1. Added accessor struct to op_array to save "accessor" related
>>> information (getter or setter, property offset)
>>>
>>> 2. Added two statement in zend_std_read_property to save property offset.
>>>
>>> 3. Added op code check in zend_compile (The pass_two() function) to mark
>>> a function is a getter)
>>>
>>>
>>> But now I encountered a problem, I can't store the result value in
>>> INIT_METHOD_CALL op, the result var is only available in DO_FCALL_*
>>>
>>>
>>>
>>> I have an idea for solving this, but I'm not sure if it's good or not:
>>>
>>>
>>> If DO_FCALL_* will always follow a INIT_METHOD_CALL, then I think we can
>>> store result var from the next op (DO_FCALL) and skip DO_FCALL directly.
>>>
>>>
>>> Would be great if I can have your advices and suggestion. :-)
>>>
>>>
>>> Thanks, Yo-An Lin
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>>
>>> On Tue, Mar 22, 2016 at 4:45 PM, Dmitry Stogov <dmi...@zend.com> wrote:
>>>
>>>> Hi Yo-An Lin,
>>>>
>>>>
>>>> This "run-time inlining" approach may work.
>>>>
>>>>
>>>> PHP compiler (or optimizer) may mark functions and methods suitable for
>>>> "run-time" inlining (e.g. methods without arguments and FETCH_OBJ_R UNUSED,
>>>> CONST -> TMP; RETURN TMP).
>>>>
>>>> Then INIT_METHOD_CALL may check this flag and execute "optimized code
>>>> sequence" instead of pushing stack frame and real call.
>>>>
>>>>
>>>> However, I'm not sure what kind of performance impact this may make,
>>>> because we will have to make additional check on each INIT_METHOD_CALL
>>>> execution.
>>>>
>>>>
>>>> Thanks. Dmitry.
>>>>
>>>>
>>>> ------------------------------
>>>> *From:* Lin Yo-An <cornelius.h...@gmail.com>
>>>> *Sent:* Saturday, March 19, 2016 10:08
>>>> *To:* Dmitry Stogov
>>>> *Cc:* internals; Xinchen Hui
>>>> *Subject:* Re: [PHP-DEV] Object getter method optimization
>>>>
>>>> Hi Dmitry,
>>>>
>>>>
>>>> Thanks for your reply! You're correct. let me try to explain your
>>>> points:
>>>>
>>>> If I have a main.php and worker.php
>>>>
>>>> And I defined work($worker) { $status = $worker->getStatus(); } inside
>>>> main.php
>>>>
>>>> when main.php is compiled, we don't know what the class entry of
>>>> $worker is. What we only know is invoking a method "getStatus" on $worker
>>>> CV unless we know we have to compile worker.php before main.php and add a
>>>> type hint on $worker.
>>>>
>>>> Is it correct?
>>>>
>>>>
>>>> Since the original approach doesn't work, here comes another new idea:
>>>>
>>>> When executing method call on an object, if we found the method body
>>>> are just 2 op codes (FETCH_OBJ_R and RETURN), we then denote the method is
>>>> a "getter method"
>>>>
>>>> And the next time, when we execute the same method, we found the
>>>> "getter method" flag, we simply execute FETCH_OBJ_R on that object and
>>>> return the value to avoid extra op code execution time.
>>>>
>>>> Do you think if this could work?
>>>>
>>>>
>>>>
>>>>
>>>> Best Regards and Thanks for your work on PHP VM
>>>> Yo-An Lin
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Fri, Mar 18, 2016 at 3:36 PM, Dmitry Stogov <dmi...@zend.com> wrote:
>>>>
>>>>> Hi Yo-An Lin,
>>>>>
>>>>> Unfortunately, this approach won't work.
>>>>> At first, at compile time we don't know the body of called getter.
>>>>> At second, the called method might be changed even at run-time,
>>>>> because of polymorphism.
>>>>>
>>>>> Tricks like this might be implemented using JIT and polymorphic inline
>>>>> caches.
>>>>>
>>>>> Thanks. Dmitry.
>>>>>
>>>>> ________________________________________
>>>>> From: Lin Yo-An <cornelius.h...@gmail.com>
>>>>> Sent: Friday, March 18, 2016 05:23
>>>>> To: internals
>>>>> Subject: [PHP-DEV] Object getter method optimization
>>>>>
>>>>> Hello Everyone,
>>>>>
>>>>>
>>>>> I am recently trying to write an optimizer that could optimize the
>>>>> getter
>>>>> method call into just one object fetch opcode.
>>>>>
>>>>> I'd like to know thoughts from you guys, here is the note:
>>>>> https://c9s.hackpad.com/INLINE-OP-TVGo9WcshbZ
>>>>>
>>>>> --
>>>>> Best Regards,
>>>>>
>>>>> Yo-An Lin
>>>>> https://github.com/c9s
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Best Regards,
>>>>
>>>> Yo-An Lin
>>>>
>>>
>>>
>>>
>>> --
>>> Best Regards,
>>>
>>> Yo-An Lin
>>>
>>
>>
>>
>> --
>> Xinchen Hui
>> @Laruence
>> http://www.laruence.com/
>>
>
>
> --
> Sent from Gmail Mobile
>



-- 
Best Regards,

Yo-An Lin

Reply via email to