У меня есть следующая тестовая среда для 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
работать здесь намного медленнее?
Задача ещё не решена.
Других решений пока нет …