@HellWalk

Как можно ускорить работу Exception?

С 2008 года с php работаю, а только сегодня узнал, что его Exception очень сильно замедляют работу:

json с 15 тысяч позиций (данные по каждой, разумеется, надо провалидировать) с Exception на каждой позиции обрабатываются 6 минут

Без исключений этот же объем данных обрабатывается за 2 секунды

Что еще интереснее, что чем больше исключений - тем дольше обрабатываются новые:

5000 позиций (все с ошибками) - 47 сек.
10000 позиций (все с ошибками) - 192 сек.
15000 позиций (все с ошибками) - 375 сек.

Если переделать валидацию с Exception на простую проверку строки:

$error = $this->handle($json);
if ($error === '') {
    // логируем что все ок
} else {
    // логируем ошибку
}


То тот же json с 15 тысяч позиций, с ошибками в каждой обрабатывается за те же 2 секунды.

В принципе, если подумать, то это логично - Exception это же отдельный класс (а точнее иерархия классов), с кучей параметров, такими как цепочка вызовов, ссылкой на файл, номер строки и прочим.

Но, возможно есть способ как-то ускорить Exception? Надежды мало, но вдруг кто-то знает способ.
  • Вопрос задан
  • 366 просмотров
Пригласить эксперта
Ответы на вопрос 3
ipatiev
@ipatiev Куратор тега PHP
Потомок старинного рода Ипатьевых-Колотитьевых
"Если вас беспокоит скорость работы исключений, вы что-то делаете неправильно"

Ускорить нельзя.
В данном случае все проблемы не из-за исключений, а из-за говнокода.

Ошибка валидации при валидации - это не исключительная ситуация, а совершенно нормальная. Часть бизнес-логики. То есть в процессе валидации всего массива данных исключения кидаться не должны.
Если исключения используются для управления ходом выполнения программы - это УЖЕ ошибка.

По результатам валидации исключение может кидаться ОДНО. В самом конце. По результатам валидации всего набора данных. Или не кидаться - зависит от конкретной бизнес-логики. Но если и кидать, то только одно, по результатам.
Это будет правильное использование исключений, которое вообще никак не скажется на скорости работы кода.
Ответ написан
Maksclub
@Maksclub Куратор тега PHP
maksfedorov.ru
на расходы конкретно на исключения для 15 000 вызовов (на каждую строку по 1 исключению) будут около 0.01 секунды (сотая секунды крч) для моего локального компа (много, но и данных много)
Пруф

618e769ee759d433078044.png


$error = $this->handle($json);
if ($error === '') {
// логируем что все ок
} else {
// логируем ошибку
}

Тут заменено не только это, а заменено что-то внутри в handle(), тк не летит исключение

возможно в описании задачи вы не указали, что валидируете возможно через что-то симфовое, не отключив finger cross, который собирает весь стек-трейс или еще что-то... кажется, не хватает контекста для понимания проблемы

в 15 тыс новых объектов проблемы может не быть. Такие задержки по времени выглядят как проблема на уровне логирования исключений, тк I/O операции над файлом долгие, а сбор трейса исключений и его запись — долгие потенциально.
Уйдя от исключений вы возможно ушли и от логирования исключений.
Ответ написан
gbg
@gbg
Любые ответы на любые вопросы
Ваш ответ на вопрос

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

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