Function call speedup (CV applied to functions)

php.internals

Sara Golemon

19 years ago
It's been a concept stuck in my mind since I first looked into ZE2.1 and saw what compiled variables were, and a recent blog post (http://php100.wordpress.com/2006/11/24/optimizations/) (which got picked up by planet PHP) got my wheels spinning again. Tonight I decided to actually sit down and see what benefit could be milked from such an endeavor and what it's maintenance cost would be. The attached patch shows what I've tossed together for HEAD and the benchmark I've run against it do show some appreciable gains... Based on this code snippet, I saw a consistent gain of aproximately 18%: for($i = 0; $i < 10000000; $i++) pi(); I chose the pi() function as it (A) would actually favor the unpatched approach, being quick to hash and strcmp. It also (B) performs minimal actual work, simply returning a constant value, thus leaving as much of the execution time to the matter being tested as possible. Of course, this isn't a "normal use" example, and it doesn't address dynamic function calls or method calls. I also havn't looked into class resolution yet, but this is a good spot to begin discussion from. Thoughts anyone? -Sara

Ilia A.

19 years ago
Looks fairly interesting, I doubt 18% is consistent benefit across the board, and when unicode overhead is removed is probably less still. But, it does look like a good optimization to make that would certainly make PHP faster then before. Ilia Alshanetsky

Sara Golemon

19 years ago
> Looks fairly interesting, I doubt 18% is consistent benefit across the > board >
I doubt it very much too. While I made that test to strip out non-fcall overhead, I also made it favor the effect being produced by constantly calling the same function from the same scope. Reality isn't like that.
> and when unicode overhead is removed is probably less still.
My numbers were based on unicode.semantics=off just FYI...
> it does look like a good optimization to make that would certainly make > PHP faster then before. >
I suspect optimized class fetches will help several cases too: foo::bar(); foo::baz(foo::BLING); Just not going to bother working on that unless it sounds worth doing to enough people. -Sara

Ilia A.

19 years ago
On 4-Dec-06, at 11:40 AM, Sara Golemon wrote:
>> Looks fairly interesting, I doubt 18% is consistent benefit across >> the board >> > I doubt it very much too. While I made that test to strip out non- > fcall overhead, I also made it favor the effect being produced by > constantly calling the same function from the same scope. Reality > isn't like that. > >> and when unicode overhead is removed is probably less still. > My numbers were based on unicode.semantics=off just FYI...
That's good, although unicode based PHP does have a number of additional checks not present in non-unicode version (not-PHP6).
>> it does look like a good optimization to make that would certainly >> make PHP faster then before. > I suspect optimized class fetches will help several cases too: > foo::bar(); > foo::baz(foo::BLING);
Only for native classes though. Ilia Alshanetsky

Mathieu CARBONNEAUX

19 years ago
Hi all, have two question! the first is where i can find documentation (other than the php source...!) about developping new sapi? if exist !? and for the seconds, have seen in differente sapi source that work like apache module and php module, with a struct who point to differente handler that abstract the handler in the sapi space... my question is how to make php engine dynamicly loadable in sapi... not embedable has embed sapi... but as sapi main executable (developp and compiled separatly) that load php engine as dso! the interest is the possibility to developpe externalised sapi! you can build php engine once and use it in other project and package it and make the possibility to build (like phpize) a new sapi from php engine already installed! have seen embed version but this version hook some of the sapi handler arbitraly... and does not make possible to hook this and other sapi handler after loading embed version... the idea is to be abel to hook all sapi handler after loaded the php engine... i'm not sure have explane correctly my idea.. excuse for my bad english... Best Regards, Mathieu

Dmitry Stogov

19 years ago
Hi Sara, Interesting patch. We had very similar idea in the past. BTW it is possible to optimize function calls mach more. Not only ZEND_DO_FCALL but also ZEND_INIT_FCALL_BY_NAME can be optimized, and we can reuse the same cache entries for all op_arrays from the same PHP file. I'll make a patch and send it to you in fey days. Thanks. Dmitry.