Ответ вслух Middle Производительность и кеш спрашивают часто обновлено

Как вы ускоряете C++-код

Вопрос

Расскажите, как вы подходите к оптимизации производительности C++-кода: от измерений до конкретных приёмов.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Начинаю с измерения: воспроизводимый бенчмарк и профиль через perf или VTune, иначе легко ускорить то, что не тормозит. Сначала смотрю на алгоритм и структуры данных: квадратичный проход или лишняя копия большого объекта перевесят любые микрооптимизации.

Что должно прозвучать в ответе

  • Сначала измерение: бенчмарк, профилировщик, 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 ошибок.