Patrones de benchmarking
Escriba microbenchmarks fiables con os.clock y evite los errores habituales.
Patrones de benchmarking es una lección gratuita de Lua Academy en CoddyKit. Esta es la lección 4 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é realizar evaluaciones de rendimiento?
Las microevaluaciones miden el rendimiento de un fragmento de código específico de forma aislada. Ayudan a verificar que una optimización realmente mejora la velocidad sin depender de la intuición.
Plantilla básica de evaluación de rendimiento
Incluya el código en un bucle, mida el tiempo de reloj de pared con os.clock() y divida entre el número de iteraciones.
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))Pasada de calentamiento
Ejecute una pasada de calentamiento antes de medir el tiempo para permitir que LuaJIT compile las trazas. Sin el calentamiento, la primera ejecución cronometrada incluye la sobrecarga de compilación de 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() - t0Evitar la eliminación de código muerto
El JIT puede optimizar y eliminar los cálculos cuyos resultados no se utilizan. Acumule los resultados en una variable para que la evaluación sea fiable.
local sum = 0
for i = 1, N do sum = sum + math.sin(i) end
print(sum) -- prevent eliminationComparar dos enfoques
Evalúe implementaciones alternativas en condiciones idénticas. Ejecútelas de forma intercalada o varias veces para minimizar el ruido de la planificación del sistema operativo.
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))Análisis estadístico
Ejecute la evaluación varias veces y calcule los valores mínimo, máximo y mediano. Debe descartar los valores atípicos provocados por pausas del GC o por la planificación del sistema operativo.
Evaluación del uso de memoria
Mida la asignación de memoria junto con el tiempo.
collectgarbage("collect")
local mem0 = collectgarbage("count")
-- ... run operation ...
collectgarbage("collect")
local mem1 = collectgarbage("count")
print(("Memory delta: %.1f KB"):format(mem1 - mem0))Evitar interferencias del GC
Detenga el GC antes de medir el tiempo para medir el tiempo de cálculo puro. Reanúdelo después.
collectgarbage("stop")
local t0 = os.clock()
for i = 1, N do -- ... end
print(os.clock() - t0)
collectgarbage("restart")Microevaluaciones frente a evaluaciones realistas
Las microevaluaciones optimizan fragmentos pequeños, pero pueden no reflejar el rendimiento en situaciones reales. Valide siempre las mejoras comparándolas con el perfil de una aplicación completa.
Utilidades de evaluación de rendimiento
Construya una utilidad reutilizable benchmark(name, fn, iters) que muestre resultados uniformes y con formato coherente en todas sus evaluaciones.
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))
endEvaluaciones de rendimiento en CI
Ejecute evaluaciones de rendimiento en CI para detectar regresiones. Emita una alerta si una evaluación empeora más de un umbral definido (por ejemplo, un 10 %).
Pregunta sobre evaluaciones de rendimiento
¿Por qué es importante una pasada de calentamiento al evaluar código de LuaJIT?
Resumen: patrones de evaluación de rendimiento
Use una pasada de calentamiento, evite la eliminación de código muerto utilizando los resultados, mida con os.clock(), controle el GC y realice varias pruebas para obtener mediciones estables. Construya una utilidad reutilizable de evaluación para mantener la coherencia.
Preguntas frecuentes
¿La lección «Patrones de benchmarking» es gratis?
Sí — el texto completo de «Patrones de benchmarking» 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 «Patrones de benchmarking»?
Escriba microbenchmarks fiables con os.clock y evite los errores habituales. 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 4 de 4.
¿Cuánto tiempo toma la lección «Patrones de benchmarking»?
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
- Descripción general de la arquitectura de LuaJIT
- Escritura de Lua compatible con JIT
- Perfilado con jit.p y perf
- Patrones de benchmarking