当前位置: 首页 > news >正文

Google Benchmark 介绍和使用指南

文章目录

  • Google Benchmark 介绍和使用指南
    • 主要特性
    • 安装 Google Benchmark
      • 使用 vcpkg 安装
      • 使用源码编译安装
    • 基本使用方法
      • 简单基准测试示例
      • 带参数的基准测试
      • 多线程基准测试
    • 常用命令行参数
    • 高级功能
      • 自定义计数器
      • 设置时间单位
      • 使用固定迭代次数
    • 实际应用建议

Google Benchmark 介绍和使用指南

Google Benchmark 是一个由 Google 开发的 C++ 微基准测试库,用于测量和比较代码片段的性能。它提供了简单易用的 API 来编写基准测试,并生成详细的性能报告。

主要特性

  1. 简单易用的 API:只需几行代码即可创建基准测试
  2. 自动测量:自动计算迭代次数以获得稳定结果
  3. 多参数支持:可以测试不同参数下的性能
  4. 丰富的输出:提供多种格式的输出(控制台、JSON、CSV等)
  5. 跨平台:支持 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);

实际应用建议

  1. 避免优化消除:使用 benchmark::DoNotOptimize() 防止编译器优化掉你的测试代码
  2. 预热缓存:在正式测试前可以先运行几次测试代码
  3. 关注稳定结果:确保测试时间足够长以获得稳定测量
  4. 多次运行:使用 --benchmark_repetitions 获取更可靠的结果
  5. 分析趋势:使用 Complexity() 分析算法复杂度是否符合预期

Google Benchmark 是一个强大的工具,可以帮助开发者精确测量代码性能,识别性能瓶颈,并验证优化效果。

http://www.dtcms.com/a/273687.html

相关文章:

  • 流批一体的“奥卡姆剃刀”:Apache Cloudberry 增量物化视图应用解析
  • CReFT-CAD 笔记 带标注工程图dxf,png数据集
  • 【EGSR2025】材质+扩散模型+神经网络相关论文整理随笔(四)
  • Jenkins 项目类型及配置项
  • FPGA实现SDI转LVDS视频发送,基于GTP+OSERDES2原语架构,提供工程源码和技术支持
  • 资源分享-FPS, 矩阵, 骨骼, 绘制, 自瞄, U3D, UE4逆向辅助实战视频教程
  • 飞算 JavaAI 深度体验:开启 Java 开发智能化新纪元
  • 【拓扑空间】示例及详解4
  • python的社区残障人士服务系统
  • 了解环网式 CAN 转光纤中继器
  • BPE(Byte Pair Encoding)分词算法
  • leetcode-hot100(283.移动零)
  • 政安晨【零基础玩转开源AI项目】ACE-Step —— 迈向音乐生成基础模型的重要一步:AI自动谱曲与自动演唱的免费开源框架部署实践
  • RLHF:人类反馈强化学习 | 对齐AI与人类价值观的核心引擎
  • python实现DoIP基本通信(收发报文)
  • 第十二章:网络编程
  • Typescript -字面量类型
  • Linux的基础I/O
  • 买小屏幕的时候注意避坑
  • [Java 17] 无模版动态生成 PDF:图片嵌入与动态表格渲染实战
  • Linux磁盘限速(Ubuntu24实测)
  • 算法学习笔记:17.蒙特卡洛算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • cnpm exec v.s. npx
  • C语言常见面试知识点详解:从入门到精通
  • 亿级流量下的缓存架构设计:Redis+Caffeine多级缓存实战
  • Web安全 - 基于 SM2/SM4 的前后端国产加解密方案详解
  • Flutter优缺点
  • Java学习第三十二部分——异常
  • 【爬虫】- 爬虫原理及其入门
  • 【批量文件查找】如何从文件夹中批量搜索所需文件复制到指定的地方,一次性查找多个图片文件并复制的操作步骤和注意事项