Задать вопрос

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

Например такой небольшой бенч и анонимная медленнее на треть.
<?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>";
  • Вопрос задан
  • 1799 просмотров
Подписаться 5 Оценить 1 комментарий
Помогут разобраться в теме Все курсы
  • OTUS
    Microservice Architecture
    5 месяцев
    Далее
  • Skillfactory
    Профессия «Белый» хакер
    13 месяцев
    Далее
  • Нетология
    Веб-разработчик с нуля: профессия с выбором специализации
    14 месяцев
    Далее
Решения вопроса 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.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы