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