avg time: clear=26,16 ns, func=69,83 ns, stat=83,53 ns, method=90,29 ns.
static/func=31,4%
method/func=46,9%
Железо: Pentium Core2duo E2200, выключено все по максимуму, кроме браузера с 1 вкладкой
Тест - простая функция ( return $i+10; ) возвращающая параметр + константа, результат которой присваивается в переменную в цикле из 100_000 повторов. Функция реализована трижды: как глобал, как статическая функция класса и как метод объекта.
4 цикла (один "пустой", без вызова но с вычислением) завернуты в 100 повторов для вычисления средних значений.
Сам тест:
Код: Выделить всё
<?php
// Проверка скорости исполнения вызовов статических, методов и простых функций для php7.3-fpm:
/** simple function */
function someTest(int $i): int
{
return $i+10;
}
class Some {
public static function statTest(int $i): int
{
return $i+10;
}
public function dynTest(int $i): int
{
return $i+10;
}
}
$objSome = new Some();
$i = 0;
$res = 0;
$num = 100;
$repeat = 1000*1000;
$sum = [];
ob_start();
do {
$start = microtime(true);
for ($i = 0; $i < $repeat; $i++) {
$res = $i+10;
}
$start = round((microtime(true) - $start)*1000, 3);
echo $res;
$sum['clear'][] = $start;
$start = microtime(true);
for ($i = 0; $i < $repeat; $i++) {
$res = someTest($i);
}
$start = round((microtime(true) - $start)*1000, 3);
echo $res;
$sum['function'][] = $start;
$start = microtime(true);
for ($i = 0; $i < $repeat; $i++) {
$res = Some::statTest($i);
}
$start = round((microtime(true) - $start)*1000, 3);
echo $res;
$sum['static'][] = $start;
$start = microtime(true);
for ($i = 0; $i < $repeat; $i++) {
$res = $objSome->dynTest($i);
}
$start = round((microtime(true) - $start)*1000, 3);
echo $res;
$sum['method'][] = $start;
} while( --$num > 0 );
ob_clean();
$num = 100;
$clear = $func = $stat = $dyn = 0.0;
for($i=0; $i<$num; $i++){
$clear += $sum['clear'][$i];
$func += $sum['function'][$i];
$stat += $sum['static'][$i];
$dyn += $sum['method'][$i];
}
// calc average time for 1 in nano seconds:
$multiplier = 1000*1000/$num/$repeat;
$clear = round($clear*$multiplier, 2);
$func = round($func*$multiplier, 2);
$stat = round($stat*$multiplier, 2);
$dyn = round($dyn*$multiplier, 2);
echo "\n<br><br>avg time: clear={$clear} ns, func={$func} ns, stat={$stat} ns, method={$dyn} ns."
, "\n<br>static/func=", round(($stat-$clear)/($func-$clear)*100 - 100, 1), '%'
, "\n<br>method/func=", round(($dyn-$clear)/($func-$clear)*100 - 100, 1), '%'
;