У меня есть следующая тестовая среда для 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;
}
}
Если я запустил этот скрипт как есть, я получу следующий результат:
Duration of 1000 builds: 0.12318682670593 secs ( 1000 )
Duration of 1000 builds: 0.12733101844788 secs ( 2000 )
Duration of 1000 builds: 0.12077212333679 secs ( 3000 )
Duration of 1000 builds: 0.12160491943359 secs ( 4000 )
Duration of 1000 builds: 0.12030696868896 secs ( 5000 )
Тем не менее, если я удалю комментарии из строки $counter = max(0, $i-$z); и вместо этого закомментирую следующие две строки, которые идентично должны делать то же самое, я получу следующие результаты:
Duration of 1000 builds: 0.3405590057373 secs ( 1000 )
Duration of 1000 builds: 0.33710408210754 secs ( 2000 )
Duration of 1000 builds: 0.3317539691925 secs ( 3000 )
Duration of 1000 builds: 0.34044504165649 secs ( 4000 )
Duration of 1000 builds: 0.33882308006287 secs ( 5000 )
Использование встроенной функции php max занимает примерно в 3 раза больше, затем вычисляется максимальное значение вручную. Как ни странно, если я перенесу это на более простой пример, без клонирования классов и построения классов, времена будут одинаковыми.
Может ли кто-нибудь объяснить, почему встроенная функция php max здесь намного медленнее?
@AlexHowansky попробовал то, что вы предложили, и отчасти был прав. Но теперь моя новая функция my_max уступает встроенной функции max. С функцией my_max я получаю ~ 0,6 секунды на 1000 сборок вместо ~ 0,3 секунды, которые я получаю с max. Можете объяснить, в чем разница?
Если вы используете> PHP 7, вы можете добавить max с помощью \, это должно дать вам некоторый импульс. Если вы не используете PHP7, переход на PHP может дать вам гораздо больший импульс.
Я ожидал, что max() будет немного быстрее, чем my_max(), но не ожидал, что он будет вдвое быстрее. Тем не менее, разница не имеет значения - ваш живой код никогда не будет узким местом для функции max().
если вы пытаетесь сделать это в одной строке, вы можете сделать это без max, включив первое присваивание в условии if, например, в этом if ($counter = $i-$z && $counter < 0) $counter = 0;. Я делаю это в своем коде все время, чтобы сбить с толку младших разработчиков ... lol






При каждом вызове функции есть накладные расходы. Я бы порекомендовал третий тест, в котором вы определяете функцию с именем
my_max, а затем помещаете туда две другие строки кода. Вы, вероятно, обнаружите, что он работает так же, как при прямом использованииmax.