Microbenchmarking con Google Benchmark
Escriba microbenchmarks fiables con Google Benchmark y evite errores de medición.
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
./benchInterpretació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.
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
- Diseños de datos favorables a la caché
- Predicción de saltos y bucles críticos
- Perfilado con perf, VTune y sanitizers
- Microbenchmarking con Google Benchmark