0Pricing
Lua Academy · Lección

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() - t0

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

Comparar 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))
end

Evaluaciones 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

  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