[TYPO3-dev] FYI: comparing execution speed of some php functions
Rupert Germann
rupi at gmx.li
Fri Jun 26 17:20:37 CEST 2009
hi devs,
I've read a lot of articles about performance in webapplications during the
last days and stumbled (again) upon questions like:
is is_array() faster than count()? or how much faster is foreach() compared
to while(list()...)?
and many more.
to get some reliable results I wrote a little test script which you can
download here http://rgdata.de/fileadmin/typo3_dev/speed_test.php.txt
The script iterates through a big array with 100000 entries and measures the
execution time of certain operations.
here are some of the results:
for() loop:
---------------------------------------------
for() loop using count() took 20.86401 ms
for() loop Not using count() took 7.09796 ms
using count() means:
for ($i = 1; $i < count($myarr); ++ $i) {...
OK, I think that should not be a new information for anyone here ;-)
but what about while and foreach?
foreach() loop:
---------------------------------------------
foreach() took 11.16920 ms
foreach() with KEY took 12.35318 ms
while(list()=each()) loop:
---------------------------------------------
while(list()...) took 58.12597 ms
while(list()...) with key took 64.06283 ms
interesting, isn't it?
That means even if I have something like this in my code:
while(list($key) = each($arr)) {
// do smthg that needs only $key
}
it will be way slower than:
foreach($arr as $key => $val) {
// do smthg that needs only $key
}
although $val is never used.
If I count the occurences of "while(list(" in class tslib_content I see some
potential here.
(FYI: the patch for class tslib_content is almost ready)
another interesting question: are statically called methods faster or those
from instantiated objects?
calling methods in classes:
---------------------------------------------
object call took 40.79103 ms
derived object call took 40.16995 ms
static call took 102.13280 ms
hmm, until now I thought it is exactly the other way round. Could someone
plaese have a look to my testscript and tell me if this behaviour is caused
by my testing method. strange.
next test: accessing array vars
let's say we have a piece of code like this:
function arraytest($num) {
for ($i = 0; $i < $num; ++ $i) {
if ($GLOBALS['foo']['bar'] == "test") {
$j = 1;
} else {
$j = FALSE;
}
}
}
quite common in TYPO3 source - e.g. all those checks involving
$GLOBALS['TYPO3_CONF_VARS']...
if we now change the code like below it will run faster:
function arraytest2($num) {
$testvar = $GLOBALS['foo']['bar'];
for ($i = 0; $i < $num; ++ $i) {
if ($testvar == "test") {
$j = 1;
} else {
$j = FALSE;
}
}
}
results:
---------------------------------------------
accessing array took 21.87395 ms
accessing local var took 13.07201 ms
the script speed_test.php makes some more tests e.g. measuring the speed of
different string comparing methods.
If you know some commonly used code constructs that can be substituted by
faster variants - let me know!
happy benchmarking!
greets
rupert
further reading:
http://www.tuxradar.com/practicalphp/18/0/0
http://phplens.com/lens/php-book/optimizing-debugging-php.php
More information about the TYPO3-dev
mailing list