0Pricing
Lua Academy · Урок

Написание кода Lua, удобного для JIT

Избегайте отказов JIT: сохраняйте стабильность типов, минимизируйте изменение размера таблиц и используйте локальные переменные.

«Написание кода Lua, удобного для JIT» — бесплатный урок Lua Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.

Почему важна дружественность к JIT

JIT-компилятор лучше всего работает со стабильным по типам и предсказуемым кодом. Непредсказуемые типы и ветвления приводят к прерыванию трасс и отказам, после чего выполнение возвращается к интерпретатору.

Сохраняйте стабильность типов

Переменная всегда должна содержать значение одного и того же типа. Если переменная попеременно содержит число и строку, JIT не может выполнить специализацию и вынужден повсюду вставлять проверки типов.

-- BAD: type unstable
local x = 1
if cond then x = "one" end  -- JIT cannot specialize x

-- GOOD: separate variables
local xNum = 1
local xStr = "one"

Используйте локальные переменные

Локальные переменные хранятся в стеке Lua и распределяются JIT по регистрам. Доступ к глобальным переменным и внешним значениям медленнее. Кэшируйте глобальные переменные как локальные в начале горячих функций.

local sin = math.sin  -- cache as local
for i = 1, 1e6 do
  result = sin(i)  -- fast local access
end

Избегайте изменения размера таблиц в циклах

Заранее выделяйте таблицы ожидаемого размера. Расширение таблицы в цикле, при пересечении следующей границы степени двойки, перераспределяет память и копирует массив, нарушая трассы JIT.

local t = table.new(1000, 0)  -- LuaJIT extension
for i = 1, 1000 do t[i] = i end

Избегайте смешивания массива и хеш-таблицы

Храните массивную часть как массив, используя целочисленные ключи начиная с 1. Смешивание целочисленных и строковых ключей в одной таблице мешает оптимизации массивов.

Избегайте замыканий в горячих внутренних циклах

Создание нового замыкания на каждой итерации выделяет память и может увеличить нагрузку на сборщик мусора. Заранее создавайте замыкания вне цикла.

-- BAD: closure created every iteration
for i = 1, 1e6 do
  local fn = function() return i end  -- allocation!
end

-- GOOD: use a local function outside
local function work(i) return i end
for i = 1, 1e6 do work(i) end

Избегайте полиморфных вызовов

Вызов разных объектов-функций из одной и той же точки вызова, то есть разных функций на каждой итерации, создаёт полиморфную точку вызова, которую JIT не может встроить.

Избегайте возможностей NYI (ещё не реализованных)

Некоторые возможности Lua не реализованы в JIT LuaJIT (NYI): string.format с некоторыми спецификаторами, pcall внутри трасс JIT, а также pairs/next. Проверьте вывод jit.v.

jit.v для подробного вывода трасс

Включите подробный вывод JIT, чтобы видеть, какие трассы скомпилированы, а какие прерваны.

-- Run script with: luajit -jv script.lua
-- Or in code:
jit.attach(function(event, ...)
  if event == "abort" then print("ABORT:", ...) end
end, "all")

Используйте массивы фиксированного размера

Если размер массива известен заранее и не меняется, объявление массива C фиксированного размера через FFI может быть значительно быстрее таблицы Lua.

Профилируйте перед оптимизацией

Сначала измерьте производительность. Преждевременная оптимизация — корень всех бед. Выполните профилирование, чтобы найти фактически горячий участок, прежде чем тратить время на переписывание кода с учётом JIT.

Вопрос о дружественности к JIT

Почему следует избегать создания замыканий внутри горячих внутренних циклов?

Итоги: Lua, дружественный к JIT

Сохраняйте стабильность типов, используйте локальные переменные, заранее выделяйте таблицы, избегайте замыканий в горячих циклах и проверяйте возможности NYI с помощью jit.v. Сначала профилируйте — оптимизируйте только подтверждённые узкие места.

Часто задаваемые вопросы

Урок «Написание кода Lua, удобного для JIT» бесплатный?

Да — полный текст урока «Написание кода Lua, удобного для JIT» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.

Чему я научусь в уроке «Написание кода Lua, удобного для JIT»?

Избегайте отказов JIT: сохраняйте стабильность типов, минимизируйте изменение размера таблиц и используйте локальные переменные. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Lua Academy?

Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Написание кода Lua, удобного для JIT»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Lua Academy?

Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

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

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