Hi!

I'd like to ask a question about call_user_func/_array performance and
the use of runtime variables to call functions and methods from the
PHP internals perspective.

There are two separate issues here: real-life PHP application performance and internal engine performance. If you are interested in the former, please do not read the rest of the message, instead please read this:

My experience (10+ years of working with PHP) shows that pretty much no application ever depends on its performance for such things. Most applications aren't even CPU-bound and those who are, their performance very rarely depends on how long it takes to make a function call, except for very small number of special cases. So unless your profiling of your specific application (not an artificial benchmark!) clearly shows this to be a problem - it does not matter.

Many people have blogged about how:-

     $callable = array($object, $bar);
     call_user_func_array($callable, $args);

is considerably slower than

     $object->$bar($args);

Indeed, the former may take more time, since it involves at least two extra things - creating the array and extra function call. Note however that the semantics of these two is different - in the latter case, the called function has one argument which is an array, in the former it has unknown number of arguments which are passed as an array to call_user_func_array().

What is the official standpoint from the PHP developers and is there
are reason to use call_user_func/_array over using variables to
express the call when considering opcode caching?  What I mean for
example, is, when using $foo->$bar($args) at runtime, maybe this is
faster than call_user_func but maybe not if an opcode cache is
involved (e.g. maybe it cannot cache $foo).  I ask this because things
like __call() and __get() are also notoriously slow.

Opcode caches do not cache any runtime variables/calls. They cache compilation results, which is the result of converting the source to opcodes and happens before the code is run. So once include() is done, opcode cache has next to no influence on runtime performance - there are various optimizations in some implementation, but most of them don't make too much difference in real life code, and especially when we talking about calling dynamically-resolved functions.

Also, would there be a reason for certain dynamic notations to be
slower than others (again with and without opcode caching incolved) -
a few examples below:

All direct function calls are pretty much the same, array access of course adds additional operations which take time too.

PHP has evolved a lot over the years so it would be nice to know what
the intention, pros and cons of these methodologies are from an
official internals point of view and if anything has been changed to
over time to make these methodologies more efficient.

There's probably no "official" position but I'd say use whatever fits your coding style and specific needs, within limits of reason.
--
Stanislav Malyshev, Software Architect
SugarCRM: http://www.sugarcrm.com/
(408)454-6900 ext. 227

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to