awesome-everything EN
↑ Обратно к восхождению

Производительность

Сначала профиль: чтение кода и трейсов

Суть Прочитай микробенчмарк, профайлер-дифф, вывод hardware counters perf и расчёт Amdahl, затем предскажи поведение и выбери фикс с наибольшим рычагом.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на senior-высоте — в орбите
◷ 14 min

Бенчмарки, профайлер-диффы и вывод counters — это где profile-first живёт или умирает. Прочитай каждый артефакт и выбери ход, который сеньор делает первым — до того, как тронуть ручку тюнинга или поверить headline-числу.

Цель

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

Сниппет 1 — бенчмарк, который слишком быстр

func BenchmarkHash(b *testing.B) {
    data := []byte("fixed-input-string")
    for i := 0; i < b.N; i++ {
        _ = fnv32(data)   // результат отброшен
    }
}
// reported: 0.31 ns/op — быстрее одной загрузки из памяти
Викторина

0.31 ns/op — ниже стоимости одной загрузки из L1. Что произошло и в чём фикс?

Сниппет 2 — профайлер-дифф против production-метрики

# Production (5-мин окно, после деплоя)
checkout_p99_ms        580   (prev 820)   # на 29% быстрее
cpu_pct                 62   (prev 58)    # CPU ВЫРОС

# go tool pprof -diff_base baseline.cpu prod.cpu
Showing nodes accounting for -3.20s, 1.15% of -278.5s total
      flat  flat%        cum   cum%
    -1.80s  0.64%     -1.80s  0.64%  net/http.(*conn).serve
    -1.40s  0.50%     -1.40s  0.50%  encoding/json.Marshal
Викторина

p99 упал на 29%, но дифф CPU-профиля показывает лишь ~1% чистого изменения CPU, а CPU% вырос. Как это примирить и что снимать дальше?

Сниппет 3 — вывод hardware counters

$ perf stat -e cycles,instructions,cache-misses ./svc bench-json
   142,310,884,001  cycles
    61,994,210,773  instructions     #  0.44  insn per cycle
     1,902,544,118  cache-misses
# flame graph: parseJSON — 35% CPU, единственный широкий лист
Викторина

parseJSON — 35% CPU. IPC 0.44 с огромным числом cache-misses. Какой фикс скорее поможет и какой — нет?

Сниппет 4 — решение по Amdahl

# Запрос всего: 200 мс. Профиль показывает:
#   funcA  100 мс (50%)   -- опция 1: рерайт для 2x  -> сэкономлено 50 мс
#   funcB   40 мс (20%)   -- опция 2: рерайт B и C на 4x каждую
#   funcC   20 мс (10%)   --            -> сэкономлено 45 мс суммарно
Викторина

Можно сделать опцию 1 ИЛИ опцию 2, не обе. Какая даёт больше общего speedup и каково общее правило?

Итог

Каждый артефакт здесь прячет ловушку или сигнал. Бенчмарк, чей результат отброшен, измеряет удалённый код, а не работу. Выигрыш p99 в 29% при плоском CPU-диффе означает, что экономия была off-CPU — сними wait-профиль, чтобы увидеть её. IPC ниже 1.0 с тяжёлыми cache-misses означает memory-stalled: чини data layout, а не алгоритм. А когда две оптимизации конкурируют, арифметика Amdahl по долям — не размер локального множителя — выбирает победителя. Прочитай число, найди ложь, затем действуй по доле.

Продолжить восхождение ↑Сначала профиль: прогони цикл на обманчивом сервисе
хоткеи развернуть
поиск
K
пред. пьеса
k
след. пьеса
j
тиры
t
это меню
?
sources3
expand
  1. 01
  2. 02
  3. 03

Trademarks belong to their respective owners. Editorial reference only.