tôi benchmarked những 3 lựa chọn (điểm chuẩn khác không phải là tách chu kỳ CPU và là 4Y cũ):
class foo {
public static function bar() {
return __METHOD__;
}
}
function directCall() {
return foo::bar($_SERVER['REQUEST_TIME']);
}
function variableCall() {
return call_user_func(array('foo', 'bar'), $_SERVER['REQUEST_TIME']);
}
function reflectedCall() {
return (new ReflectionMethod('foo', 'bar'))->invoke(null, $_SERVER['REQUEST_TIME']);
}
Thời gian tuyệt đối thực hiện cho 1.000.000 lặp:
print_r (Benchmark (mảng ('directCall', 'variableCall', 'reflectCall'), 1000000));
Array
(
[directCall] => 4.13348770
[variableCall] => 6.82747173
[reflectedCall] => 8.67534351
)
Và thời gian tương đối, còn với 1.000.000 lặp (chạy riêng biệt):
ph() -> Dump (Benchmark (array ('directCall', 'variableCall', ' reflectCall '), 1000000, true));
Array
(
[directCall] => 1.00000000
[variableCall] => 1.67164707
[reflectedCall] => 2.13174915
)
Có vẻ như rằng hiệu suất phản ánh được tăng lên rất nhiều trong 5.4.7 (từ ~ 500% xuống ~ 213%).
Đây là Benchmark()
chức năng tôi đã sử dụng nếu có ai muốn chạy lại chuẩn này:
function Benchmark($callbacks, $iterations = 100, $relative = false)
{
set_time_limit(0);
if (count($callbacks = array_filter((array) $callbacks, 'is_callable')) > 0)
{
$result = array_fill_keys($callbacks, 0);
$arguments = array_slice(func_get_args(), 3);
for ($i = 0; $i < $iterations; ++$i)
{
foreach ($result as $key => $value)
{
$value = microtime(true);
call_user_func_array($key, $arguments);
$result[$key] += microtime(true) - $value;
}
}
asort($result, SORT_NUMERIC);
foreach (array_reverse($result) as $key => $value)
{
if ($relative === true)
{
$value /= reset($result);
}
$result[$key] = number_format($value, 8, '.', '');
}
return $result;
}
return false;
}
tôi sử dụng phản ánh trong Europa (http://europaphp.org, http://github.com/treshugart/EuropaPHP) và nó là nhanh hơn so với tất cả những. – Tres
Zend Framework 1.x sử dụng Reflection trong Bootstrapping. Vì ZF cho phép các hàm '_init' được gọi tự động, nó cần một số cơ chế cho việc này. Và nó sử dụng Reflection. –
Laravel sử dụng Reflection khá một chút. –