Google Benchmark 介绍和使用指南
文章目录
- Google Benchmark 介绍和使用指南
- 主要特性
- 安装 Google Benchmark
- 使用 vcpkg 安装
- 使用源码编译安装
- 基本使用方法
- 简单基准测试示例
- 带参数的基准测试
- 多线程基准测试
- 常用命令行参数
- 高级功能
- 自定义计数器
- 设置时间单位
- 使用固定迭代次数
- 实际应用建议
Google Benchmark 介绍和使用指南
Google Benchmark 是一个由 Google 开发的 C++ 微基准测试库,用于测量和比较代码片段的性能。它提供了简单易用的 API 来编写基准测试,并生成详细的性能报告。
主要特性
- 简单易用的 API:只需几行代码即可创建基准测试
- 自动测量:自动计算迭代次数以获得稳定结果
- 多参数支持:可以测试不同参数下的性能
- 丰富的输出:提供多种格式的输出(控制台、JSON、CSV等)
- 跨平台:支持 Linux、Windows 和 macOS
安装 Google Benchmark
使用 vcpkg 安装
vcpkg install benchmark
使用源码编译安装
git clone https://github.com/google/benchmark.git
cd benchmark
cmake -Bbuild -S. -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON
cmake --build build --config Release
sudo cmake --build build --config Release --target install
基本使用方法
简单基准测试示例
#include <benchmark/benchmark.h>static void BM_StringCreation(benchmark::State& state) {for (auto _ : state) {std::string empty_string;}
}
// 注册基准测试
BENCHMARK(BM_StringCreation);static void BM_StringCopy(benchmark::State& state) {std::string x = "hello";for (auto _ : state) {std::string copy(x);}
}
BENCHMARK(BM_StringCopy);BENCHMARK_MAIN();
带参数的基准测试
static void BM_StringCompare(benchmark::State& state) {std::string s1(state.range(0), 'a');std::string s2(state.range(0), 'b');for (auto _ : state) {benchmark::DoNotOptimize(s1.compare(s2));}state.SetComplexityN(state.range(0));
}
// 测试不同长度的字符串比较
BENCHMARK(BM_StringCompare)->RangeMultiplier(2)->Range(8, 8<<10)->Complexity();
多线程基准测试
static void BM_StringConcatenation(benchmark::State& state) {std::string s1 = "hello";std::string s2 = "world";for (auto _ : state) {std::string result = s1 + s2;benchmark::DoNotOptimize(result);}
}
// 测试1-8线程下的性能
BENCHMARK(BM_StringConcatenation)->ThreadRange(1, 8);
常用命令行参数
运行编译后的基准测试程序时,可以添加以下参数:
--benchmark_filter=<regex>
:只运行匹配的基准测试--benchmark_min_time=<min_time>
:设置每个测试的最小运行时间(秒)--benchmark_repetitions=<num>
:设置重复次数并显示统计信息--benchmark_report_aggregates_only={true|false}
:只显示统计信息--benchmark_format=<console|json|csv>
:设置输出格式--benchmark_out=<filename>
:将结果输出到文件--benchmark_out_format=<json|console|csv>
:设置文件输出格式--benchmark_counters_tabular={true|false}
:以表格形式显示计数器
高级功能
自定义计数器
static void BM_SomeFunction(benchmark::State& state) {int items_processed = 0;for (auto _ : state) {// 处理一些数据items_processed += state.range(0);}state.counters["items_per_second"] = benchmark::Counter(items_processed, benchmark::Counter::kIsRate);
}
设置时间单位
static void BM_FastFunction(benchmark::State& state) {for (auto _ : state) {// 非常快的操作}
}
BENCHMARK(BM_FastFunction)->Unit(benchmark::kNanosecond);
使用固定迭代次数
static void BM_Deterministic(benchmark::State& state) {for (auto _ : state) {// 测试代码}
}
BENCHMARK(BM_Deterministic)->Iterations(1000);
实际应用建议
- 避免优化消除:使用
benchmark::DoNotOptimize()
防止编译器优化掉你的测试代码 - 预热缓存:在正式测试前可以先运行几次测试代码
- 关注稳定结果:确保测试时间足够长以获得稳定测量
- 多次运行:使用
--benchmark_repetitions
获取更可靠的结果 - 分析趋势:使用
Complexity()
分析算法复杂度是否符合预期
Google Benchmark 是一个强大的工具,可以帮助开发者精确测量代码性能,识别性能瓶颈,并验证优化效果。