Почему при сортиртировке именованная функция быстрее чем анонимная?

Например такой небольшой бенч и анонимная медленнее на треть.
<?php
function cmp($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
};

$count = 100000;
$time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    $arr = [9, 7, 1, 5, 7, 12, 3, 9, 2];
    usort($arr, function ($a, $b) {
        if ($a == $b) {
            return 0;
        }
        return ($a < $b) ? -1 : 1;
    });
}
$time = microtime(true) - $time;
echo "Time: {$time}</br>";

$time = microtime(true);
for ($i = 0; $i < $count; $i++) {
    $arr = [9, 7, 1, 5, 7, 12, 3, 9, 2];
    usort($arr, 'cmp');
}
$time = microtime(true) - $time;
echo "Time: {$time}</br>";
  • Вопрос задан
  • 1793 просмотра
Решения вопроса 2
empr
@empr
Дело в том, что вы в каждой из 100 000 итераций объявляете эту функцию. Если вы присвоите анонимную функцию переменной за пределами цикла (да, при этом функция по-прежнему будет считаться анонимной), то скорость сравняется.

$cmp = function ($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
};

for ($i = 0; $i < $count; $i++) {
    usort($arr, $cmp);
}

Time: 0.074096918106079
Time: 0.074237108230591
Ответ написан
neuotq
@neuotq
Прокрастинация
Потому что при каждой итерации цикла анонимная функция создается заново, те это каждый раз новый независимый объект Closure.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы