0Pricing
Lua Academy · Урок

Шаблоны бенчмаркинга

Пишите надёжные микроизмерения производительности с помощью 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 — локальная установка не требуется.

Все уроки этого курса

  1. Обзор архитектуры LuaJIT
  2. Написание кода Lua, удобного для JIT
  3. Профилирование с jit.p и perf
  4. Шаблоны бенчмаркинга
← Назад к Lua Academy