Как вы ускоряете C++-код
Вопрос
Расскажите, как вы подходите к оптимизации производительности C++-кода: от измерений до конкретных приёмов.
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Сначала измерение: бенчмарк, профилировщик, perf stat
Алгоритм и структуры данных в первую очередь
Локальность: непрерывные контейнеры, плоские массивы, SoA
Аллокации: reserve, переиспользование, пулы
Ветвления, встраивание, векторизация, флаги компилятора
Многопоточность: false sharing, блокировки
Что могут спросить следом
- Как понять, что код упирается в память, а не в вычисления?
- Когда unordered_map медленнее отсортированного vector?
Разбор
Начинаю с измерения: воспроизводимый бенчмарк и профиль через perf или VTune, иначе легко ускорить то, что не тормозит. Сначала смотрю на алгоритм и структуры данных: квадратичный проход или лишняя копия большого объекта перевесят любые микрооптимизации. Дальше память: непрерывные контейнеры вместо узловых, плоский вектор вместо вектора векторов, обход в порядке хранения, разделение горячих и холодных полей, иногда structure of arrays. Затем аллокации: reserve, переиспользование буферов, string_view, пулы. Потом ветвления и встраивание: убрать виртуальные вызовы и std::function из горячего цикла, дать компилятору векторизовать простой цикл, включить LTO и PGO. В многопоточном коде проверяю false sharing и конкуренцию за мьютексы. perf stat подсказывает, во что упираемся: промахи кеша, ошибки предсказания или инструкции. После каждого изменения снова измеряю.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.