0Pricing
Lua Academy · Lección

Escritura de Lua compatible con JIT

Evite las salidas del JIT: mantenga estables los tipos, minimice el redimensionamiento de tablas y utilice variables locales.

Escritura de Lua compatible con JIT es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Lua Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Lua Academy incluye 4 lecciones en total.

Por qué es importante la compatibilidad con JIT

El compilador JIT funciona mejor con código estable en cuanto a tipos y predecible. Los tipos y las ramificaciones impredecibles provocan la interrupción de trazas y abandonos, lo que hace que la ejecución vuelva al intérprete.

Mantener estables los tipos

Una variable debería contener siempre el mismo tipo. Si una variable alterna entre un número y una cadena, el JIT no puede especializar el código y debe insertar comprobaciones de tipo en todas partes.

-- 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"

Utilizar variables locales

Las variables locales se almacenan en la pila de Lua (el JIT las asigna a registros). El acceso a globales y upvalues es más lento. Almacene las globales en variables locales al principio de las funciones activas.

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

Evitar redimensionar tablas en bucles

Preasigne las tablas con el tamaño esperado. Hacer crecer una tabla dentro de un bucle (al cruzar el siguiente límite de una potencia de 2) reasigna y copia el array, lo que interrumpe las trazas del JIT.

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

Evitar mezclar array y hash

Mantenga las partes de array como arrays (claves enteras a partir de 1). Mezclar claves enteras y de cadena en la misma tabla impide las optimizaciones de arrays.

Evitar closures en bucles internos activos

Crear una closure nueva en cada iteración reserva memoria y puede aumentar la presión sobre el GC. Preasigne las closures fuera del bucle.

-- 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

Evitar llamadas polimórficas

Llamar a distintos objetos de función desde el mismo punto de llamada (funciones diferentes en cada iteración) crea un punto de llamada polimórfico que el JIT no puede insertar.

Evitar funciones NYI (aún no implementadas)

Algunas funciones de Lua no están implementadas en el JIT de LuaJIT (NYI): string.format con algunos especificadores, pcall dentro de trazas JIT y pairs/next. Compruébelo con jit.v.

jit.v para obtener trazas detalladas

Active la salida detallada del JIT para ver qué trazas se compilan y cuáles se interrumpen.

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

Utilizar arrays de tamaño fijo

Cuando un array tiene un tamaño fijo conocido, declararlo como un array de C de tamaño constante mediante FFI puede ser mucho más rápido que utilizar una tabla de Lua.

Perfilar antes de optimizar

Mida primero. La optimización prematura es la raíz de todos los males. Haga un perfil para encontrar la ruta realmente activa antes de dedicar tiempo a reescribir el código para que sea compatible con JIT.

Pregunta sobre la compatibilidad con JIT

¿Por qué debería evitar crear closures dentro de bucles internos activos?

Resumen: Lua compatible con JIT

Mantenga estables los tipos, utilice variables locales, preasigne las tablas, evite las closures en bucles activos y busque funciones NYI con jit.v. Haga un perfil primero y optimice únicamente los cuellos de botella comprobados.

Preguntas frecuentes

¿La lección «Escritura de Lua compatible con JIT» es gratis?

Sí — el texto completo de «Escritura de Lua compatible con JIT» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Lua Academy, actualiza a CoddyKit PRO. El curso de Lua Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Escritura de Lua compatible con JIT»?

Evite las salidas del JIT: mantenga estables los tipos, minimice el redimensionamiento de tablas y utilice variables locales. Practicas Lua Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Lua Academy?

No se requiere experiencia previa. Lua Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Escritura de Lua compatible con JIT»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Lua Academy?

Sí. Cada lección de Lua Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Descripción general de la arquitectura de LuaJIT
  2. Escritura de Lua compatible con JIT
  3. Perfilado con jit.p y perf
  4. Patrones de benchmarking
← Volver a Lua Academy