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
> <javascript:_e(%7B%7D,'cvml','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
>> <javascript:_e(%7B%7D,'cvml','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
>>> <javascript:_e(%7B%7D,'cvml','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
>>> <javascript:_e(%7B%7D,'cvml','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
>>>> <javascript:_e(%7B%7D,'cvml','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

Reply via email to