对比范围
- 直接调用
- 变量函数调用
call_user_func
调用call_user_func_array
调用
测试结果
call_user_func_array
所用时间为:1.1608240604401s
测试代码:
<?php error_reporting(E_ALL | E_STRICT); define('ITERATIONS', 2000000); class Bench { private $bench_name; private $start_time; private $end_time; public function start($name) { $this->bench_name = $name; $this->start_time = microtime(true); } public function end() { $this->end_time = microtime(true); echo "Call style: " . $this->bench_name . '; ' . ($this->end_time - $this->start_time) . " seconds". PHP_EOL; } } class Test { public function test($a, $b, $c) { return; } } $bench = new Bench(); $test = new Test(); $arg = [1, 2, 3]; $func_name = 'test'; $bench->start('normal'); for ($i=0; $i < ITERATIONS; ++$i) { $test->test($arg[0], $arg[1], $arg[2]); } $bench->end(); $bench->start('var_function'); for ($i=0; $i < ITERATIONS; ++$i) { $test->$func_name($arg[0], $arg[1], $arg[2]); } $bench->end(); $bench->start('call_user_func'); for ($i=0; $i < ITERATIONS; ++$i) { call_user_func([$test, $func_name], $arg[0], $arg[1], $arg[2]); } $bench->end(); $bench->start('call_user_func_array'); for ($i=0; $i < ITERATIONS; ++$i) { call_user_func_array([$test, $func_name], $arg); } $bench->end();
Iterations: 100 000
Averaged over: 10
PHP 5.6.30 (cli) (built: Jan 18 2017 19:47:28)
Overall Average | |||
---|---|---|---|
Invocation | Time (s) | Delta (s) | % |
directFunction | 0.0089 | -0.0211 | -70.19 |
directStatic | 0.0098 | -0.0202 | -67.39 |
directLambda | 0.0109 | -0.0191 | -63.52 |
directInstance | 0.0116 | -0.0184 | -61.31 |
directClosure | 0.0150 | -0.0150 | -50.15 |
Invoke | 0.0282 | -0.0018 | -6.13 |
call_user_func | 0.0300 | ||
ClosureFactory | 0.0316 | +0.0016 | +5.20 |
assignedClosureFactory | 0.0328 | +0.0028 | +9.28 |
call_user_func_array | 0.0399 | +0.0099 | +33.02 |
InvokeCallUserFunc | 0.0418 | +0.0118 | +39.17 |
directImplementation | 0.0475 | +0.0175 | +58.28 |
Iterations: 100 000
Averaged over: 10
PHP 7.1.2 (cli) (built: Feb 14 2017 21:24:45)
Overall Average | |||
---|---|---|---|
Invocation | Time (s) | Delta (s) | % |
directFunction | 0.0043 | -0.0096 | -68.92 |
directStatic | 0.0050 | -0.0089 | -64.04 |
directInstance | 0.0058 | -0.0081 | -58.22 |
directLambda | 0.0063 | -0.0075 | -54.44 |
directClosure | 0.0081 | -0.0058 | -41.57 |
call_user_func | 0.0139 | ||
call_user_func_array | 0.0147 | +0.0008 | +5.84 |
Invoke | 0.0187 | +0.0048 | +34.61 |
ClosureFactory | 0.0207 | +0.0069 | +49.43 |
assignedClosureFactory | 0.0219 | +0.0080 | +57.75 |
directImplementation | 0.0232 | +0.0094 | +67.53 |
InvokeCallUserFunc | 0.0264 | +0.0126 | +90.67 |
.
资料来源:
https://segmentfault.com/q/1010000012081290