Парсер логов замедлился в 20 раз на файле с битыми строками
std::optional<int> parseStatus(const std::string& field) {
try {
return std::stoi(field);
} catch (const std::exception&) {
return std::nullopt;
}
}
На чистых логах парсер обрабатывает 2 млн строк в секунду. На файле, где треть полей статуса — "-", скорость падает в разы, а профиль заполнен функциями раскрутки стека _Unwind_*. Что исправить?
- Разбирать число через std::from_chars
- Ловить std::invalid_argument вместо exception
- Пометить функцию parseStatus как noexcept
- Вызывать std::stol вместо std::stoi
