Last active
December 29, 2015 20:19
-
-
Save kalaomer/7723372 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; | |
$method = "func"; | |
$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->$method(); break; | |
case 1: $test->$method($args[0]); break; | |
case 2: $test->$method($args[0], $args[1]); break; | |
case 3: $test->$method($args[0], $args[1], $args[2]); break; | |
case 4: $test->$method($args[0], $args[1], $args[2], $args[3]); break; | |
default: call_user_func_array(array($test, "func"), $args); break; | |
} | |
} | |
$endTime = microtime(true); | |
echo "switch4 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->$method(); break; | |
case 1: $test->$method($args[0]); break; | |
case 2: $test->$method($args[0], $args[1]); break; | |
case 3: $test->$method($args[0], $args[1], $args[2]); break; | |
case 4: $test->$method($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->$method($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 "switch5 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->$method(); break; | |
case 1: $test->$method($args[0]); break; | |
case 2: $test->$method($args[0], $args[1]); break; | |
case 3: $test->$method($args[0], $args[1], $args[2]); break; | |
case 4: $test->$method($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->$method($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 "switch6 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->$method(); break; | |
case 1: $test->$method($args[0]); break; | |
case 2: $test->$method($args[0], $args[1]); break; | |
case 3: $test->$method($args[0], $args[1], $args[2]); break; | |
case 4: $test->$method($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; | |
case 7: $test->$method($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 "switch7 with $argNum args took ", $endTime - $startTime, "<br/>"; | |
$startTime = microtime(true); | |
for ($i = 0; $i < $nIter; ++$i) { | |
switch (count($args)) { | |
case 0: $test->$method(); break; | |
case 1: $test->$method($args[0]); break; | |
case 2: $test->$method($args[0], $args[1]); break; | |
case 3: $test->$method($args[0], $args[1], $args[2]); break; | |
case 4: $test->$method($args[0], $args[1], $args[2], $args[3]); break; | |
case 5: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4]); break; | |
case 6: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); break; | |
case 7: $test->$method($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; | |
case 8: $test->$method($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 "switch8 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.1215801239014 | |
switch4 with 0 args took 1.8156170845032 | |
switch5 with 0 args took 1.7048377990723 | |
switch6 with 0 args took 1.7189400196075 | |
switch7 with 0 args took 1.8472509384155 | |
switch8 with 0 args took 1.6081829071045 | |
cufa..... with 1 args took 1.9279148578644 | |
switch4 with 1 args took 1.9993758201599 | |
switch5 with 1 args took 1.8132920265198 | |
switch6 with 1 args took 2.0582749843597 | |
switch7 with 1 args took 1.9575378894806 | |
switch8 with 1 args took 2.0112478733063 | |
cufa..... with 2 args took 2.0891020298004 | |
switch4 with 2 args took 1.9759240150452 | |
switch5 with 2 args took 2.0946450233459 | |
switch6 with 2 args took 2.0142688751221 | |
switch7 with 2 args took 1.9607429504395 | |
switch8 with 2 args took 2.0445168018341 | |
cufa..... with 3 args took 2.1587781906128 | |
switch4 with 3 args took 2.3637220859528 | |
switch5 with 3 args took 2.1905059814453 | |
switch6 with 3 args took 2.1991949081421 | |
switch7 with 3 args took 2.1115100383759 | |
switch8 with 3 args took 2.1482570171356 | |
cufa..... with 4 args took 2.1826131343842 | |
switch4 with 4 args took 2.1618781089783 | |
switch5 with 4 args took 2.2142999172211 | |
switch6 with 4 args took 2.1935439109802 | |
switch7 with 4 args took 2.1384229660034 | |
switch8 with 4 args took 2.1365571022034 | |
cufa..... with 5 args took 2.1128919124603 | |
switch4 with 5 args took 3.2247068881989 | |
switch5 with 5 args took 2.1787729263306 | |
switch6 with 5 args took 2.2605440616608 | |
switch7 with 5 args took 2.2953009605408 | |
switch8 with 5 args took 2.3160681724548 | |
cufa..... with 6 args took 2.3878610134125 | |
switch4 with 6 args took 3.3582279682159 | |
switch5 with 6 args took 3.3788089752197 | |
switch6 with 6 args took 2.2977991104126 | |
switch7 with 6 args took 2.3199419975281 | |
switch8 with 6 args took 2.2740068435669 | |
cufa..... with 7 args took 2.2021870613098 | |
switch4 with 7 args took 3.3562769889832 | |
switch5 with 7 args took 3.4254908561707 | |
switch6 with 7 args took 3.5399889945984 | |
switch7 with 7 args took 2.4141519069672 | |
switch8 with 7 args took 2.4895689487457 | |
cufa..... with 8 args took 2.5288751125336 | |
switch4 with 8 args took 3.6048829555511 | |
switch5 with 8 args took 3.5779588222504 | |
switch6 with 8 args took 3.590185880661 | |
switch7 with 8 args took 3.7888240814209 | |
switch8 with 8 args took 2.5570089817047 | |
cufa..... with 20 args took 2.9334599971771 | |
switch4 with 20 args took 3.9678640365601 | |
switch5 with 20 args took 4.0554811954498 | |
switch6 with 20 args took 4.0949809551239 | |
switch7 with 20 args took 4.1448619365692 | |
switch8 with 20 args took 4.210844039917 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment