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

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

Закон Амдала и self-time: потолок любого ускорения, которое ты можешь выпустить

Суть Закон Амдала даёт потолок любого ускорения. Self-time vs cum-time говорит: чинить саму функцию или спускаться к её callees.
Высота — путь к senior
НольJuniorMiddleSenior
Ты на middle-высоте — в небе
◷ 16 min

Команда тратит три недели на переписывание хэш-функции с локальным ускорением в 10x. Задеплоенный сервис стал быстрее на 1.05x. Закон Амдала дал бы ответ до начала работы — если бы сначала проверили профиль.

Закон Амдала: потолок любого ускорения

Если часть кода занимает долю p от общего времени исполнения, и ты ускоряешь её в s раз, суммарное ускорение приложения:

суммарное_ускорение = 1 / ((1 − p) + p/s)

Предельный случай — сделать секцию бесконечно быстрой — даёт:

макс_ускорение = 1 / (1 − p)

Функция, занимающая 10% общего времени, никогда не даст больше 1.11x суммарного ускорения, даже если заменить её на заглушку. Функция на 80% даёт 5x, если ускорить её вдвое.

Этот закон превращает «стоит ли оптимизировать это?» в количественный вопрос. Снял профиль, увидел, что функция X занимает 12% времени исполнения — и сразу понимаешь: даже идеальное переписывание ограничено потолком в 13.6%. Если потолок ниже твоей планки — не начинай. Если функция Y занимает 70% — двукратное ускорение Y даёт 1.54x суммарно, инженерное время оправдано.

Доля общего времени (p)Макс. суммарное ускорение (p → 0)Ускорение при 2x на секции
10%1.11x1.05x
50%2.00x1.33x
80%5.00x1.67x
90%10.0x1.82x

Время на стене, CPU-время и self-time

Профиль сообщает несколько разных видов измерения времени, и путаница между ними — самая частая ошибка при чтении.

  • Wall-clock time — то, что чувствует пользователь: сколько времени занял запрос от начала до конца. Запрос на 500 мс wall-clock, использовавший 50 мс CPU, на 90% состоит из ожидания (диск, сеть, локи, GC).
  • CPU time — сколько из wall-clock было потрачено на реальные вычисления.
  • Self-time — время, потраченное в собственном коде функции, без учёта времени в вызванных ею функциях.
  • Cumulative time (cum-time) — включает время в вызовах.

Чтение профиля: если cum-time большой, а self-time маленький — функция является роутинговым/диспетчерским слоем: медленная работа происходит в том, что она вызывает; спускайся вниз. Если self-time большой — функция сама делает работу; там и живёт фикс.

Путаница между ними приводит к оптимизации обёртки, пока реальная цена сидит в callee — или наоборот.

Почему это работает

«Оптимизировать 10% кода до нуля» — классический пример ловушки Амдала. Даже полное устранение этого кода даёт лишь 1.11x — ниже порога большинства команд для ломающего изменения. Профиль определяет, какие доли достаточно велики, чтобы их атаковать. Без него рискуешь потратить неделю на ускорения в 1.05x.

Закон Амдала и экономика profile-first
Макс. ускорение по Амдалу
1 / (1 − p), где p = доля ускоренного кода
Оптимизация 10% кода до нуля
1.11x суммарного максимума
Оптимизация 50% кода до нуля
2.0x суммарного максимума
Оптимизация 90% кода до нуля
10.0x суммарного максимума
Типичные накладные расходы сэмплирующего профайлера
0.5-5% CPU

Применяем закон Амдала, чтобы решить, какая оптимизация стоит усилий

1/3
Викторина

Профиль показывает: cum-time функции X — 80%, self-time — 2%. Что это означает и где искать фикс?

Викторина

Микробенчмарк показывает, что новая хэш-функция в 10x быстрее старой. После интеграции приложение стало быстрее лишь на 1.05x. Наиболее вероятное объяснение?

Вспомните перед уходом
  1. 01
    Пройди через закон Амдала с примером: функция X занимает 30% времени исполнения. Ты ускоряешь X в 5 раз. Каково суммарное ускорение и какую долю времени теперь занимает X?
  2. 02
    В чём разница между self-time и cum-time, и какое действие подсказывает каждый показатель?
Итог

Закон Амдала задаёт потолок: суммарное_ускорение = 1 / ((1 − p) + p/s). Профиль даёт p — долю общего времени, которую занимает целевая функция. Без этого числа нельзя решить, оправдана ли оптимизация инженерным временем. Функция на 10% общего времени никогда не даст больше 1.11x ускорения, даже если сделать её бесплатной; на 80% — до 5x. Self-time vs cum-time определяет, где искать: большой self-time — чини функцию напрямую; большой cum-time при крошечном self-time — спускайся к callee, где живёт реальная цена.

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

Trademarks belong to their respective owners. Editorial reference only.