Skip to content

Instantly share code, notes, and snippets.

@kalaomer
Last active December 29, 2015 20:19
Show Gist options
  • Save kalaomer/7723372 to your computer and use it in GitHub Desktop.
Save kalaomer/7723372 to your computer and use it in GitHub Desktop.
<?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/>";
}
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