0Pricing
Go Academy · Lección

Escritura de benchmarks con testing.B

BenchmarkXxx, bucle b.N e indicador -bench

Escritura de benchmarks con testing.B es una lección gratuita de Go Academy en CoddyKit. Esta es la lección 1 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 Go Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Go Academy incluye 4 lecciones en total.

Firma de la función de benchmark

Los benchmarks comienzan por Benchmark y reciben *testing.B. Se ejecutan en el archivo _test.go, junto con las pruebas normales.

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(2, 3)
    }
}

b.N

El framework de testing ajusta automáticamente b.N —el número de iteraciones del bucle— hasta que el benchmark se ejecuta durante al menos 1 segundo, lo que produce una cifra estable de nanosegundos por operación.

Ejecutar benchmarks

Los benchmarks no se ejecutan solo con go test. Use -bench para habilitarlos:

go test -bench=. -benchmem ./...
// BenchmarkAdd-8  500000000  2.13 ns/op  0 B/op  0 allocs/op

Indicador -benchmem

-benchmem añade estadísticas de asignación: bytes por operación y número de asignaciones por operación. Un número elevado de asignaciones suele indicar problemas de rendimiento.

b.ResetTimer

Llame a b.ResetTimer() después de la configuración costosa que no deba contabilizarse en el benchmark:

func BenchmarkQuery(b *testing.B) {
    db := setupDB() // expensive
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        db.Query("SELECT 1")
    }
}

b.StopTimer / b.StartTimer

Pause y reanude el temporizador alrededor de la configuración y la limpieza que no deban contabilizarse en el tiempo del benchmark.

for i := 0; i < b.N; i++ {
    b.StopTimer()
    data := generateInput()
    b.StartTimer()
    process(data)
}

b.SetBytes

Llame a b.SetBytes(n) para informar del rendimiento (bytes/segundo), además del tiempo por operación. Es útil para realizar benchmarks de serialización o de código de red.

b.SetBytes(int64(len(payload)))
for i := 0; i < b.N; i++ {
    encode(payload)
}

Comparar benchmarks

Use benchstat para comparar dos ejecuciones de un benchmark y observar diferencias estadísticamente significativas:

go test -bench=. -count=10 > before.txt
# make change
go test -bench=. -count=10 > after.txt
benchstat before.txt after.txt

Evitar la eliminación de código muerto

Asigne el resultado a una variable a nivel de paquete o a un sumidero para evitar que el compilador optimice y elimine el código del benchmark:

var result int
func BenchmarkFib(b *testing.B) {
    for i := 0; i < b.N; i++ {
        result = Fib(20)
    }
}

Sub-benchmarks

Use b.Run para crear sub-benchmarks con nombre, de forma similar a las pruebas basadas en tablas:

for _, size := range []int{10, 100, 1000} {
    b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
        for i := 0; i < b.N; i++ { sort(make([]int, size)) }
    })
}

Benchmark frente a perfilado

Los benchmarks cuantifican el rendimiento. El perfilado (pprof) muestra dónde se emplea el tiempo. Use benchmarks para medir y perfilado para diagnosticar dónde optimizar.

Comprobación rápida

¿Por qué el cuerpo del bucle del benchmark debe usar el resultado para evitar la optimización del compilador?

Resumen: benchmarks

Puntos clave:

  • BenchmarkXxx(b *testing.B) con for i := 0; i < b.N; i++
  • go test -bench=. -benchmem para obtener estadísticas de asignación
  • b.ResetTimer() después de la configuración costosa
  • Use benchstat para comparar ejecuciones; asigne los resultados para evitar su eliminación

Preguntas frecuentes

¿La lección «Escritura de benchmarks con testing.B» es gratis?

Sí — el texto completo de «Escritura de benchmarks con testing.B» 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 Go Academy, actualiza a CoddyKit PRO. El curso de Go Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Escritura de benchmarks con testing.B»?

BenchmarkXxx, bucle b.N e indicador -bench Practicas Go 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 Go Academy?

No se requiere experiencia previa. Go 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 1 de 4.

¿Cuánto tiempo toma la lección «Escritura de benchmarks con testing.B»?

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 Go Academy?

Sí. Cada lección de Go 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. Escritura de benchmarks con testing.B
  2. Perfilado de CPU con pprof
  3. Perfilado del heap y de las asignaciones
  4. Trazado de la ejecución
← Volver a Go Academy