Тестирование PHP - встроенная функция min () кажется очень медленной

У меня есть следующая тестовая среда для 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 здесь намного медленнее?

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

Alex Howansky 09.01.2019 21:49

@AlexHowansky попробовал то, что вы предложили, и отчасти был прав. Но теперь моя новая функция my_max уступает встроенной функции max. С функцией my_max я получаю ~ 0,6 секунды на 1000 сборок вместо ~ 0,3 секунды, которые я получаю с max. Можете объяснить, в чем разница?

Adam Baranyai 09.01.2019 21:52

Если вы используете> PHP 7, вы можете добавить max с помощью \, это должно дать вам некоторый импульс. Если вы не используете PHP7, переход на PHP может дать вам гораздо больший импульс.

Dharman 09.01.2019 21:56

Я ожидал, что max() будет немного быстрее, чем my_max(), но не ожидал, что он будет вдвое быстрее. Тем не менее, разница не имеет значения - ваш живой код никогда не будет узким местом для функции max().

Alex Howansky 09.01.2019 22:02

если вы пытаетесь сделать это в одной строке, вы можете сделать это без max, включив первое присваивание в условии if, например, в этом if ($counter = $i-$z && $counter < 0) $counter = 0;. Я делаю это в своем коде все время, чтобы сбить с толку младших разработчиков ... lol

ArtisticPhoenix 09.01.2019 22:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
36
0

Другие вопросы по теме