Перейти к содержанию

Оптимизация производительности

Начало урока

Оптимизация производительности

Сначала измеряй, меняй по одному, и доверяй только воспроизводимым числам

Главная идея: Быстрый код пишется не по интуиции - его измеряют. Современный процессор, его иерархия памяти и оптимизирующий компилятор образуют систему, поведение которой действительно трудно предсказать по исходнику. Профессиональный цикл таков: профилировать, чтобы найти, куда реально уходит время, выдвинуть гипотезу, внести одно точечное изменение и честно измерить, чтобы подтвердить пользу. Всё в этой теме служит этому циклу.
К концу вы сможете:
  • использовать профайлер, чтобы находить реальные горячие точки, а не гадать,
  • рассуждать об иерархии памяти и писать дружественные к кэшу раскладки данных,
  • устранять лишние копии ссылками, перемещением, reserve и представлениями,
  • понимать, что на самом деле делают инлайнинг и оптимизация на этапе компоновки,
  • писать честные микробенчмарки, переживающие оптимизатор.

1. Профилируй до оптимизации

Самая дорогая ошибка в работе над производительностью - оптимизировать код, который никогда не был медленным. Программы проводят большую часть времени в малой доле кода, и эта доля, как правило, не там, где ожидает даже опытный инженер. Профайлер измеряет, где действительно тратится время, чтобы вы чинили то, что важно.

Распространены два семейства профайлеров:

  • Сэмплирующие профайлеры (perf, VTune, Instruments) прерывают программу много раз в секунду и записывают стек вызовов. Они почти не добавляют накладных расходов и дают статистическую картину горячих точек. Отлично для первого взгляда на реальную нагрузку.
  • Инструментирующие профайлеры (callgrind, gprof) вставляют счётный код вокруг каждой функции. Они дают точное число вызовов, но замедляют программу во много раз и искажают крохотные функции.

Оптимизацию ограничивает и арифметика. Закон Амдала гласит: если доля p времени тратится в ускоряемой части и вы сделаете её бесконечно быстрой, вся программа ускорится максимум в 1 / (1 - p) раз. Если в функции 10% времени, её идеализация сэкономит не больше 10% в целом - поэтому профилируйте, чтобы найти большое p, а остальное игнорируйте.

Правило: нет коммита оптимизации без измерения до/после. "Должно быть быстрее" - это гипотеза, а не результат.

Продолжите этот урок на YourAIZone

В полном уроке — объяснение целиком, разобранные примеры, частые ошибки, тесты с мгновенной проверкой и ИИ-репетитор. Начните сразу как гость или создайте аккаунт, чтобы сохранять прогресс.

В полном уроке

  • Объяснение целиком
  • Разобранные примеры
  • Частые ошибки и как их избежать
  • Тестовые вопросы: 15
  • ИИ-репетитор, который отвечает на вопросы по теме
  • Отслеживание прогресса для ученика, родителей и учителя