Skip to content

Instantly share code, notes, and snippets.

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