Google Benchmark性能测试

Google Benchmark性能测试

Google Benchmark 是一个用于 C++ 的微基准测试框架,专为测量小块代码的性能而设计。它提供了一种简单而强大的方式来编写、运行和分析基准测试,帮助开发人员识别性能瓶颈并优化代码。本教程将从安装和基本用法开始,逐步深入到高级功能,并通过 C++ 示例演示如何结合测试实践。


1. 安装 Google Benchmark

在 Ubuntu 上安装 Google Benchmark 非常简单。以下是安装步骤:

  1. 更新软件包列表

    sudo apt-get update
    
  2. 安装 Google Benchmark

    sudo apt-get install libbenchmark-dev
    
  3. 验证安装
    安装完成后,你可以通过编译一个简单的基准测试程序来验证安装是否成功。


2. 基本用法

Google Benchmark 的基本用法是定义一个基准测试函数,并使用 BENCHMARK 宏注册它。以下是一个简单的示例:

示例 1:测量函数执行时间

代码
#include <benchmark/benchmark.h>
#include <chrono>
#include <thread>void BM_Sleep(benchmark::State& state) {for (auto _ : state) {std::this_thread::sleep_for(std::chrono::milliseconds(100));}
}BENCHMARK(BM_Sleep);BENCHMARK_MAIN();
编译和运行
  1. 编译

    g++ -std=c++11 -O2 -o benchmark_example benchmark_example.cpp -lbenchmark -lpthread
    
    • -lbenchmark 链接 Google Benchmark 库。
    • -lpthread 链接 pthread 库(Google Benchmark 依赖)。
  2. 运行

    ./benchmark_example
    
输出分析

运行后,你将看到类似以下的输出:

2023-10-01 12:00:00
Running ./benchmark_example
Run on (8 X 4200 MHz CPU s)
CPU Caches:L1 Data 32 KiB (x4)L1 Instruction 32 KiB (x4)L2 Unified 256 KiB (x4)L3 Unified 8192 KiB (x1)
***WARNING*** CPU scaling is enabled, the benchmark real time measurements may be noisy and will incur extra overhead.
---------------------------------------------------------
Benchmark               Time             CPU   Iterations
---------------------------------------------------------
BM_Sleep         100000000 ns    100000000 ns           7
  • Time:每次迭代的平均时间。
  • CPU:每次迭代的 CPU 时间。
  • Iterations:基准测试运行的迭代次数。

示例 2:测量不同参数下的性能

Google Benchmark 允许你通过 RangeArgs 指定参数,测试不同输入下的性能。

代码
#include <benchmark/benchmark.h>
#include <vector>void BM_VectorPushBack(benchmark::State& state) {for (auto _ : state) {std::vector<int> v;for (int i = 0; i < state.range(0); ++i) {v.push_back(i);}}
}BENCHMARK(BM_VectorPushBack)->Range(8, 8<<10);BENCHMARK_MAIN();
编译和运行
  1. 编译

    g++ -std=c++11 -O2 -o benchmark_range benchmark_range.cpp -lbenchmark -lpthread
    
  2. 运行

    ./benchmark_range
    
输出分析

输出将显示不同 vector 大小下的性能:

---------------------------------------------------------
Benchmark               Time             CPU   Iterations
---------------------------------------------------------
BM_VectorPushBack/8          10 ns          10 ns    10000000
BM_VectorPushBack/64         80 ns          80 ns     1000000
BM_VectorPushBack/512       640 ns         640 ns      100000
BM_VectorPushBack/4096     5120 ns        5120 ns       10000
BM_VectorPushBack/32768   40960 ns       40960 ns        1000

这表明随着 vector 大小的增加,push_back 操作的耗时也相应增加。


3. 高级功能

Google Benchmark 还提供了一些高级功能,帮助你更精细地控制基准测试。

3.1 自定义计时

你可以使用 DoNotOptimizeClobberMemory 来防止编译器优化掉你的代码。

代码
#include <benchmark/benchmark.h>void BM_CustomTiming(benchmark::State& state) {for (auto _ : state) {int result = 0;for (int i = 0; i < 1000; ++i) {result += i;}benchmark::DoNotOptimize(result);benchmark::ClobberMemory();}
}BENCHMARK(BM_CustomTiming);BENCHMARK_MAIN();
  • DoNotOptimize:防止编译器优化掉 result
  • ClobberMemory:确保内存操作不被优化。

3.2 测量内存使用

Google Benchmark 允许你测量内存使用情况。

代码
#include <benchmark/benchmark.h>
#include <vector>void BM_MemoryUsage(benchmark::State& state) {for (auto _ : state) {std::vector<int> v(state.range(0), 0);benchmark::DoNotOptimize(v.data());}state.SetBytesProcessed(state.iterations() * state.range(0) * sizeof(int));
}BENCHMARK(BM_MemoryUsage)->Range(8, 8<<10);BENCHMARK_MAIN();
  • SetBytesProcessed:设置每次迭代处理的字节数,用于计算吞吐量。

3.3 多线程基准测试

你可以使用 Threads 指定线程数,测试多线程环境下的性能。

代码
#include <benchmark/benchmark.h>
#include <atomic>std::atomic<int> counter(0);void BM_AtomicIncrement(benchmark::State& state) {for (auto _ : state) {counter++;}
}BENCHMARK(BM_AtomicIncrement)->Threads(4);BENCHMARK_MAIN();
  • Threads(4):在 4 个线程中运行基准测试。

4. 结合测试实践

在实际开发中,基准测试应与单元测试和性能分析工具结合使用,以确保代码的正确性和高效性。

4.1 与单元测试集成

你可以在 CI/CD 管道中运行基准测试,监控性能变化。

4.2 与性能分析工具结合

使用 perfValgrind 等工具,深入分析基准测试结果,定位瓶颈。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/75642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度剖析:域名与DNS安全的全方位解读

导语 在互联网的庞大体系中,域名如同我们访问网络资源的“门牌号”,而DNS则像是将门牌号翻译为具体地址的“翻译官”。然而,这看似平常的域名与DNS系统,却面临着诸多安全风险。一旦遭受攻击,可能导致网站无法访问、用户数据泄露等严重后果。了解域名与DNS安全知识,对保障…

CSS 的可继承性

在面试中回答关于CSS可继承性的问题时&#xff0c;建议采用结构化、清晰且简洁的方式&#xff0c;展示你对这一概念的理解以及实际应用能力。以下是一个参考回答模板&#xff1a; 1. 定义和概念 “CSS的可继承性是指某些CSS属性可以被子元素自动继承的特性。也就是说&#xf…

string 的接口

我们继续来讲解一些常用的string接口。 一.at接口 我们来看一个越界的问题。 我们运行之后发现这是一个断言错误&#xff0c;直接就终止我们的程序了&#xff0c;不能作为异常被捕捉到&#xff0c;但是我们如果不想让程序直接崩溃该怎么办呢&#xff1f; 此时我们就要用到at关键…

DeepSeek调用API访问,使用AnythingLLM建立本地知识库后开放API调用,ApiFox/PostMan调用本地DeepSeek

上篇文章中我们使用AnythingLLM成功在本地部署了DeepSeek的本地知识库&#xff0c;并且上传了几个文件让DeepSeek学习&#xff0c;可点击查看&#xff1a; 本地部署DeepSeek并使用AnythingLLM建立本地知识库全流程&#xff0c;DeepSeek-R1:7b本地安装部署,DeepSeek-R1本地部署…

创新NDT解决方案:XARION激光超声系统助力航空航天材料的高效监测

XARION激光超声检测系统是一种高效的无损检测工具&#xff0c;它利用激光技术产生超声波信号&#xff0c;并通过无膜光学麦克风捕捉这些信号&#xff0c;提供非接触式的超声检测解决方案。该系统适用于多种材料和复杂表面的检测&#xff0c;满足工业、医疗和科研领域的严格标准…

基于 PHP 内置类及函数的免杀 WebShell

前言 PHP 作为广泛使用的服务端语言&#xff0c;其灵活的内置类&#xff08;如 DOMDocument&#xff09;和文件操作机制&#xff08;.ini、.inc 的自动加载&#xff09;&#xff0c;为攻击者提供了天然的隐蔽通道。通过 动态函数拼接、反射调用、加密混淆 和 伪命名空间 等手法…

Arduino、ESP32驱动BME688环境传感器(环境传感器篇)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 4.1、读取数据(无IAQ指数) 4.2、读取数据(带IAQ数值) BME688环境传感器是一款四合一MEMS环境传感器,可测量VOC(挥发性有机物)、温度、湿度、气压这四个参数,非常适用于监测空气质量。由于…

数据结构——顺序栈seq_stack

前言&#xff1a;大家好&#x1f60d;&#xff0c;本文主要介绍了数据结构——顺序栈 目录 一、概念 1.1 顺序栈的基本概念 1.2 顺序栈的存储结构 二、基本操作 2.1 结构体定义 2.2 初始化 2.3 判空 2.4 判满 2.5 扩容 2.6 插入 入栈 2.7 删除 出栈 2.8 获取栈顶元…

C++20 中的std::c8rtomb和 std::mbrtoc8

文章目录 1. 引言2. std::c8rtomb 函数详解3. std::mbrtoc8 函数详解4. 使用示例5. 注意事项6. 总结 1. 引言 C20 标准引入了对 UTF-8 编码的更好支持&#xff0c;其中包括两个重要的函数&#xff1a;std::c8rtomb 和 std::mbrtoc8。这两个函数分别用于将 UTF-8 编码的字符转换…

AI音乐生成革命:解读昆仑万维Mureka O1的技术突破与应用实践

AI音乐生成革命&#xff1a;解读昆仑万维Mureka O1的技术突破与应用实践 全球音乐产业正经历AI技术重塑&#xff0c;昆仑万维最新发布的音乐推理大模型Mureka O1引发行业震动。本文深度解析其技术原理与实测表现&#xff0c;揭开AI音乐创作新纪元的技术密码 一、技术演进&…

《Operating System Concepts》阅读笔记:p483-p488

《Operating System Concepts》学习第 40 天&#xff0c;p483-p488 总结&#xff0c;总计 6 页。 一、技术总结 1.object storage (1)object storage 管理软件 Hadoop file system(HDFS)、Ceph。 二、英语总结(生词&#xff1a;1) 1.commodity (1)commodity: com-(“tog…

强化学习与神经网络结合(以 DQN 展开)

目录 基于 PyTorch 实现简单 DQN double DQN dueling DQN Noisy DQN&#xff1a;通过噪声层实现探索&#xff0c;替代 ε- 贪心策略 Rainbow_DQN如何计算连续型的Actions 强化学习中&#xff0c;智能体&#xff08;Agent&#xff09;通过与环境交互学习最优策略。当状态空间或动…

“11.9元“引发的系统雪崩:Spring Boot中BigDecimal反序列化异常全链路狙击战 ✨

&#x1f4a5; "11.9元"引发的系统雪崩&#xff1a;Spring Boot中BigDecimal反序列化异常全链路狙击战 &#x1f3af; &#x1f50d; 用 Mermaid原生防御体系图 #mermaid-svg-XZtcYBnmHrF9bFjc {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

Cortex-M7进入异常中断分析

使用cmbacktrace库&#xff0c;其支持M3,4,7。 1、串口输出异常信息 #define cmb_println(...) Debug_Printf(__VA_ARGS__)//cmb_println处理可变参数和格式化字符串 int Debug_Printf(const char *fmt, ...) {char buffer[DEBUG_TxBUFLEN];INT16U n;va_list args;va_star…

如何管理间接需求?团队实践分享

管理间接需求的核心方法包括明确需求识别流程、建立规范的需求管理体系、实施有效的需求沟通机制。 其中&#xff0c;明确需求识别流程最为关键。企业在实际业务中&#xff0c;往往会遇到大量的间接需求&#xff0c;如非直接生产性的采购需求、服务类需求等。这些需求往往隐蔽性…

与Aspose.pdf类似的jar库分享

如果你在寻找类似于 Aspose.PDF 的 JAR 库&#xff0c;这些库通常用于处理 PDF 文档的创建、编辑、转换、合并等功能。以下是一些类似的 Java 库&#xff0c;它们提供 PDF 处理的功能&#xff0c;其中一些是收费的&#xff0c;但也有开源选项&#xff1a; 1. iText (iText PDF…

2-2 MATLAB鮣鱼优化算法ROA优化CNN超参数回归预测

本博客来源于CSDN机器鱼&#xff0c;未同意任何人转载。 更多内容&#xff0c;欢迎点击本专栏目录&#xff0c;查看更多内容。 目录 0.引言 1.ROA优化CNN 2.主程序调用 3.结语 0.引言 在博客【ROA优化LSTM超参数回归】中&#xff0c;我们采用ROA对LSTM的学习率、迭代次数…

企业入驻成都国际数字影像产业园,可享150多项专业服务

企业入驻成都国际数字影像产业园&#xff0c;可享150多项专业服务 全方位赋能&#xff0c;助力影像企业腾飞 入驻成都国际数字影像产业园&#xff0c;企业将获得一个涵盖超过150项专业服务的全周期、一站式支持体系&#xff0c;旨在精准解决企业发展各阶段的核心需求&#xf…

线路板元器件介绍及选型指南:提高电路设计效率

电路板&#xff08;PCB&#xff09;是现代电子设备的核心&#xff0c;其上安装了各类电子元器件&#xff0c;这些元器件通过PCB的导电线路彼此连接&#xff0c;实现信号传输与功能执行。 元器件的选择与安装直接决定了电子产品的性能与稳定性。本文将为大家详细介绍电路板上的…

探究 Arm Compiler for Embedded 6 的 Clang 版本

原创标题&#xff1a;Arm Compiler for Embedded 6 的 Clang 版本 原创作者&#xff1a;庄晓立&#xff08;LIIGO&#xff09; 原创日期&#xff1a;20250218&#xff08;首发日期20250326&#xff09; 原创连接&#xff1a;https://blog.csdn.net/liigo/article/details/14653…