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/

Reply via email to