Шаблоны бенчмаркинга
Пишите надёжные микроизмерения производительности с помощью os.clock и избегайте распространённых ошибок.
«Шаблоны бенчмаркинга» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Зачем нужны тесты производительности
Микротесты производительности измеряют быстродействие конкретного фрагмента кода в изоляции. Они помогают проверить, действительно ли оптимизация повышает скорость, не полагаясь на интуицию.
Базовый шаблон теста производительности
Поместите код в цикл, измерьте реальное время выполнения с помощью os.clock() и разделите результат на число итераций.
local N = 1e6
local t0 = os.clock()
for i = 1, N do
-- code to benchmark
end
local elapsed = os.clock() - t0
print(("%.2f ns/op"):format(elapsed / N * 1e9))Прогрев
Перед замером выполните прогревочный проход, чтобы LuaJIT успел скомпилировать трассировки. Без прогрева первый замер включает накладные расходы на компиляцию JIT.
for i = 1, 1000 do hotFunction(i) end -- warm up
local t0 = os.clock()
for i = 1, N do hotFunction(i) end
local elapsed = os.clock() - t0Предотвращение удаления мёртвого кода
JIT может удалить вычисления, результаты которых не используются. Накапливайте результаты в переменной, чтобы тест производительности оставался достоверным.
local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum) -- prevent eliminationСравнение двух подходов
Тестируйте альтернативные реализации в одинаковых условиях. Запускайте их вперемешку или по нескольку раз, чтобы уменьшить шум, вызванный планированием OS.
local function approach1() -- ...
end
local function approach2() -- ...
end
local function bench(fn, n)
local t = os.clock()
for _ = 1, n do fn() end
return os.clock() - t
end
print("A:", bench(approach1, 1e5))
print("B:", bench(approach2, 1e5))Статистический анализ
Запустите тест производительности несколько раз и вычислите минимум, максимум и медиану. Выбросы, вызванные паузами сборки мусора или планированием OS, следует отбросить.
Измерение памяти
Одновременно с длительностью измеряйте выделение памяти.
collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))Исключение влияния сборки мусора
Остановите сборку мусора перед замером, чтобы измерить чистое время вычислений. После замера возобновите её.
collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")Реалистичные тесты и микротесты
Микротесты помогают оптимизировать небольшие фрагменты, но могут не отражать производительность в реальных условиях. Всегда проверяйте улучшения по профилю всего приложения.
Вспомогательные средства для тестов производительности
Создайте повторно используемое средство benchmark(name, fn, iters), которое выводит согласованные результаты в едином формате для всех ваших тестов производительности.
local function benchmark(name, fn, iters)
iters = iters or 1e5
for _ = 1, iters // 10 do fn() end -- warm up
local t = os.clock()
for _ = 1, iters do fn() end
local ns = (os.clock() - t) / iters * 1e9
print(("%-30s %8.1f ns/op"):format(name, ns))
endТестирование производительности в CI
Запускайте тесты производительности в CI, чтобы обнаруживать регрессии быстродействия. Выдавайте предупреждение, если результат теста ухудшился больше заданного порога (например, на 10%).
Вопрос о тестах производительности
Почему прогревочный проход важен при тестировании кода LuaJIT?
Итоги: подходы к тестированию производительности
Используйте прогревочный проход, предотвращайте удаление мёртвого кода, используя результаты, измеряйте время с помощью os.clock(), контролируйте сборку мусора и проводите несколько испытаний для стабильных измерений. Для единообразия создайте повторно используемое средство тестирования производительности.
Часто задаваемые вопросы
Урок «Шаблоны бенчмаркинга» бесплатный?
Да — полный текст урока «Шаблоны бенчмаркинга» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Шаблоны бенчмаркинга»?
Пишите надёжные микроизмерения производительности с помощью os.clock и избегайте распространённых ошибок. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Шаблоны бенчмаркинга»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Обзор архитектуры LuaJIT
- Написание кода Lua, удобного для JIT
- Профилирование с jit.p и perf
- Шаблоны бенчмаркинга