Ben bu 3 seçenek (diğer kriter yarma CPU döngülerini değildi ve 4y eski) Benchmarking:
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']);
}
Mutlak zaman 1.000.000 tekrarlamalar için alınan:
print_r(Benchmark(array('directCall', 'variableCall',
'reflectedCall'), 1000000));
Array
(
[directCall] => 4.13348770
[variableCall] => 6.82747173
[reflectedCall] => 8.67534351
)
Ve göreli zaman, aynı zamanda 1.000.000 yineleme (ayrı çalışma) ile:
ph()->Dump(Benchmark(array('directCall', 'variableCall',
'reflectedCall'), 1000000, true));
Array
(
[directCall] => 1.00000000
[variableCall] => 1.67164707
[reflectedCall] => 2.13174915
)
Bu yansıma performansı büyük ölçüde (aşağı ~213% için ~ 500 'den%) Madde 5.4.7' de arttığı görülmektedir.
Burada herkes yeniden çalıştırın bu kriter istiyorsa ben kullanılan Benchmark()
fonksiyonu bulunuyor:
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;
}