Бенчмарки в CI — это отлично, но они сообщают о проблеме слишком поздно. Идеально было бы получать сигнал о том, что код стал работать медленнее, прямо во время запуска локальных тестов. Но как сделать это стабильным, если время выполнения (`elapsed time`) постоянно скачет?
Автор в статье предлагает использовать количество инструкций CPU вместо времени.
Если вы изменили код, количество инструкций CPU (почти всегда) изменится:
🔛 Это не гарантирует, что код стал медленнее (влияют кэши, предсказания переходов и т.д.), но это верный признак того, что производительность могла измениться.
🔛 Это дает гораздо более стабильные цифры, чем замер времени, особенно на одной и той же машине.
Для Linux можно использовать библиотеку
py-perf-event, которая дает доступ к системному вызову perf_event_open().Пример теста:
from py_perf_event import measure, Hardware
from wordcount import wordcount
def test_speed():
[instruction_count] = measure(
[Hardware.INSTRUCTIONS],
wordcount,
DATA
)
# Сравниваем с эталоном (округление помогает избежать шума)
assert round(instruction_count / 100_000) == 3127, "Скорость изменилась!"
Чтобы добиться идеальной точности, можно:
1. Фиксировать
PYTHONHASHSEED: чтобы рандом в хешировании словарей не влиял на проход по коду.2. Отключать ASLR (рандомизацию адресного пространства): через команду
setarch x86_64 -R pytest.3. Использовать один и тот же билд Python: например, через
uv python install.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека питониста
#буст
