Forked from kalaomer/call_user_func_array vs direct call.php
Created
April 11, 2014 06:05
-
-
Save lifesign/10443228 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
set_time_limit(300); | |
error_reporting(E_ALL); | |
class test { | |
function func() {} | |
} | |
$test = new test; | |
$nIter = 1000000; | |
$argNums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 20]; | |
foreach ($argNums as $argNum) { | |
$args = $argNum == 0 ? [] : array_fill(0, $argNum, null); | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
call_user_func_array(array($test, "func"), $args); | |
} | |
$endTime = microtime(true); | |
echo "cufa..... with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->func(); break; | |
case 1: $test->func($args[0]); break; | |
case 2: $test->func($args[0], $args[1]); break; | |
case 3: $test->func($args[0], $args[1], $args[2]); break; | |
case 4: $test->func($args[0], $args[1], $args[2], $args[3]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "direct4 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->func(); break; | |
case 1: $test->func($args[0]); break; | |
case 2: $test->func($args[0], $args[1]); break; | |
case 3: $test->func($args[0], $args[1], $args[2]); break; | |
case 4: $test->func($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->func($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "direct5 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->func(); break; | |
case 1: $test->func($args[0]); break; | |
case 2: $test->func($args[0], $args[1]); break; | |
case 3: $test->func($args[0], $args[1], $args[2]); break; | |
case 4: $test->func($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->func($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "direct6 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->func(); break; | |
case 1: $test->func($args[0]); break; | |
case 2: $test->func($args[0], $args[1]); break; | |
case 3: $test->func($args[0], $args[1], $args[2]); break; | |
case 4: $test->func($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->func($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; | |
case 7: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "direct7 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->func(); break; | |
case 1: $test->func($args[0]); break; | |
case 2: $test->func($args[0], $args[1]); break; | |
case 3: $test->func($args[0], $args[1], $args[2]); break; | |
case 4: $test->func($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->func($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; | |
case 7: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; | |
case 8: $test->func($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "direct8 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
echo "<br/>"; | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Result: | |
cufa..... with 0 args took 2.3234748840332 | |
direct4 with 0 args took 2.221657037735 | |
direct5 with 0 args took 2.1198871135712 | |
direct6 with 0 args took 1.9100079536438 | |
direct7 with 0 args took 2.2164869308472 | |
direct8 with 0 args took 2.0375180244446 | |
cufa..... with 1 args took 2.876091003418 | |
direct4 with 1 args took 2.3113219738007 | |
direct5 with 1 args took 2.5826649665833 | |
direct6 with 1 args took 2.3003940582275 | |
direct7 with 1 args took 2.5728559494019 | |
direct8 with 1 args took 2.4689521789551 | |
cufa..... with 2 args took 2.7534861564636 | |
direct4 with 2 args took 2.2353329658508 | |
direct5 with 2 args took 2.6200020313263 | |
direct6 with 2 args took 2.6223680973053 | |
direct7 with 2 args took 2.4782650470734 | |
direct8 with 2 args took 2.2264201641083 | |
cufa..... with 3 args took 2.6287357807159 | |
direct4 with 3 args took 2.4872150421143 | |
direct5 with 3 args took 2.4751689434052 | |
direct6 with 3 args took 2.4236278533936 | |
direct7 with 3 args took 2.5335540771484 | |
direct8 with 3 args took 2.0688591003418 | |
cufa..... with 4 args took 2.4400899410248 | |
direct4 with 4 args took 2.1242189407349 | |
direct5 with 4 args took 2.3574469089508 | |
direct6 with 4 args took 2.2366180419922 | |
direct7 with 4 args took 2.2650620937347 | |
direct8 with 4 args took 2.3383798599243 | |
cufa..... with 5 args took 2.2263879776001 | |
direct4 with 5 args took 3.2700300216675 | |
direct5 with 5 args took 2.1632010936737 | |
direct6 with 5 args took 2.1753380298615 | |
direct7 with 5 args took 2.1594140529633 | |
direct8 with 5 args took 2.1733820438385 | |
cufa..... with 6 args took 2.2293989658356 | |
direct4 with 6 args took 3.3342609405518 | |
direct5 with 6 args took 3.3906331062317 | |
direct6 with 6 args took 2.2561731338501 | |
direct7 with 6 args took 2.2503859996796 | |
direct8 with 6 args took 2.2640450000763 | |
cufa..... with 7 args took 2.2761299610138 | |
direct4 with 7 args took 3.4104251861572 | |
direct5 with 7 args took 3.4465351104736 | |
direct6 with 7 args took 3.4869239330292 | |
direct7 with 7 args took 2.3297309875488 | |
direct8 with 7 args took 2.4133460521698 | |
cufa..... with 8 args took 2.6314709186554 | |
direct4 with 8 args took 3.8451640605927 | |
direct5 with 8 args took 3.8177552223206 | |
direct6 with 8 args took 3.9519009590149 | |
direct7 with 8 args took 3.864305973053 | |
direct8 with 8 args took 2.6021559238434 | |
cufa..... with 20 args took 3.1113379001617 | |
direct4 with 20 args took 4.1316969394684 | |
direct5 with 20 args took 4.1746439933777 | |
direct6 with 20 args took 4.2146589756012 | |
direct7 with 20 args took 4.4657280445099 | |
direct8 with 20 args took 4.219153881073 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment