C++ Academy · Lección

Microbenchmarking con Google Benchmark

Escriba microbenchmarks fiables con Google Benchmark y evite errores de medición.

Lección 4 de 415 pasos

Microbenchmarking con Google Benchmark es una lección gratuita de C++ 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 C++ Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C++ Academy incluye 4 lecciones en total.

¿Por qué hacer microbenchmarks?

El perfilado macro muestra dónde se emplea el tiempo. Los microbenchmarks miden código específico de forma aislada, lo que resulta útil para comparar algoritmos o implementaciones.

Configuración de Google Benchmark

Biblioteca de benchmarks de C++ prácticamente solo de cabeceras, creada por Google. Instálela mediante vcpkg, Conan o apt; enlace con -lbenchmark.

#include <benchmark/benchmark.h>

static void BM_StringCopy(benchmark::State& state) {
    std::string s = "Hello, World!";
    for (auto _ : state) {
        std::string copy(s);
    }
}
BENCHMARK(BM_StringCopy);
BENCHMARK_MAIN();

Compilación y ejecución

Compile con optimización, enlace con la biblioteca de benchmarks y ejecute el programa.

g++ -O2 -DNDEBUG bench.cpp -lbenchmark -lpthread -o bench
./bench

Interpretación de la salida

La biblioteca imprime el tiempo por iteración, el número de iteraciones y el tiempo de CPU. Compare las líneas base con los cambios propuestos.

Cómo evitar trucos del optimizador

El optimizador puede eliminar el código inútil. Utilice benchmark::DoNotOptimize para obligarlo a que el resultado «importe».

for (auto _ : state) {
    auto result = expensive_function();
    benchmark::DoNotOptimize(result);
}

Cómo evitar escrituras muertas

benchmark::ClobberMemory indica al compilador que se ha observado el estado de la memoria y evita la eliminación de escrituras.

Benchmarks parametrizados

Pruebe la misma función con distintos tamaños de entrada.

static void BM_Sort(benchmark::State& state) {
    std::vector<int> v(state.range(0));
    std::iota(v.rbegin(), v.rend(), 0);
    for (auto _ : state) {
        auto copy = v;
        std::sort(copy.begin(), copy.end());
    }
}
BENCHMARK(BM_Sort)->RangeMultiplier(2)->Range(8, 1<<14);

Benchmarks multihilo

Pruebe la escalabilidad con el modificador Threads.

BENCHMARK(BM_ConcurrentMap)->Threads(1)->Threads(4)->Threads(16);

Contadores personalizados

Realice un seguimiento de métricas específicas del dominio, como bytes/sec o items/sec.

state.SetItemsProcessed(state.iterations() * input.size());
state.SetBytesProcessed(state.iterations() * input.size() * sizeof(int));

Salida estadística

Ejecute el programa con --benchmark_repetitions=10 para obtener la media, la mediana y la desviación estándar. La biblioteca las informa automáticamente.

Errores habituales

Tenga cuidado con:

  • El compilador elimina el código «muerto» → utilice DoNotOptimize
  • Los efectos de calentamiento → mida muchas iteraciones
  • El escalado de la frecuencia de la CPU → fije el núcleo y desactive el boost
  • La ejecución de otros procesos → realice el benchmark en una máquina sin carga

Lectura crítica de los números

Una mejora del 5 % podría ser ruido de medición. Ejecute varias repeticiones y confíe solo en diferencias estadísticamente significativas. Compare con una línea base conocida.

Alternativas

Otras herramientas de microbenchmarks:

  • Nonius: benchmark de C++ solo de cabeceras
  • Hayai: más antiguo, pero ligero
  • Catch2 incluye compatibilidad integrada con benchmarks

Comprobación rápida

¿Por qué utilizar benchmark::DoNotOptimize(result) dentro de un bucle de benchmark?

Resumen

Utilice Google Benchmark para realizar mediciones detalladas. Evite los trucos del compilador con DoNotOptimize y ClobberMemory. Utilice benchmarks parametrizados y multihilo para explorar el comportamiento con distintas entradas y niveles de concurrencia. Confíe solo en diferencias estadísticamente significativas.

Gratis para empezar

Aprende C++ con un tutor de IA — gratis

Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.

Cursos
51
Lecciones
203

Preguntas frecuentes

¿La lección «Microbenchmarking con Google Benchmark» es gratis?

Sí — el texto completo de «Microbenchmarking con Google Benchmark» 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 C++ Academy, actualiza a CoddyKit PRO. El curso de C++ Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Microbenchmarking con Google Benchmark»?

Escriba microbenchmarks fiables con Google Benchmark y evite errores de medición. Practicas C++ 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 C++ Academy?

No se requiere experiencia previa. C++ 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 «Microbenchmarking con Google Benchmark»?

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 C++ Academy?

Sí. Cada lección de C++ 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. Diseños de datos favorables a la caché
  2. Predicción de saltos y bucles críticos
  3. Perfilado con perf, VTune y sanitizers
  4. Microbenchmarking con Google Benchmark
← Volver a C++ Academy