У меня есть следующая тестовая среда для php:
class Test {
public $counter;
public static $timer = null;
public static $instances = 0;
public function __construct() {
$this->counter++;
if (self::$instances == 0) {
self::$timer = microtime(true);
}
self::$instances++;
if (self::$instances % 1000 === 0) {
echo "Duration of 1000 builds: " . (microtime(true) - self::$timer) . " secs ( " . self::$instances . " )\n";
self::$timer = microtime(true);
}
}
public function __clone() {
$this->__construct();
}
}
$Test = new Test();
$array = array();
for ($i=0; $i<5000; $i++) {
$array[$i] = clone $Test;
for ($z=0; $z<1000; $z++) {
//$counter = max(0, $i-$z);
$counter = $i-$z;
if ($counter < 0) $counter = 0;
$get = $array[$counter]->counter;
}
}
Если я запускаю этот скрипт как есть, я получаю следующий вывод:
Продолжительность 1000 построений: 0,12318682670593 с (1000)
Длительность 1000 сборок: 0,12733101844788 с (2000)
Длительность 1000 сборок: 0,12077212333679 с (3000)
Длительность 1000 сборок: 0,12160491943359 с (4000)
Длительность 1000 сборок: 0,12030696868896 с (5000)
Тем не менее, если я уберу комментарии из строки $counter = max(0, $i-$z);
и закомментирую следующие две строки, которые одинаково должны делать то же самое, я получу следующие результаты:
Длительность 1000 сборок: 0,3405590057373 с (1000)
Длительность 1000 сборок: 0,33710408210754 с (2000)
Длительность 1000 сборок: 0,3317539691925 с (3000)
Продолжительность 1000 построений: 0,34044504165649 с (4000)
Длительность 1000 сборок: 0,33882308006287 с (5000)
Использование встроенной функции php max
занимает примерно в 3 раза больше, чем вычисление максимального значения вручную. Странно, если я перенесу это в более простой пример, без клонирования классов и построения классов, времена будут равны.
Может ли кто-нибудь объяснить, почему встроенная в PHP функция max
работает намного медленнее?