Google Benchmark:高性能C++代码基准测试框架

news/2025/11/30 18:07:19/文章来源:https://www.cnblogs.com/qife122/p/19289831

Google Benchmark:高性能C++代码基准测试框架

项目描述

Google Benchmark是一个专业的C++微基准测试库,由Google开发并开源。该项目提供了精确的性能测量工具,支持复杂的统计分析、多线程测试和算法复杂度计算。通过简单的API,开发者可以轻松编写和运行基准测试,获取可靠的性能数据来优化代码。

功能特性

  • 精确计时测量:支持实时时间、CPU时间和手动时间测量
  • 多线程基准测试:内置多线程支持,可测试并发性能
  • 参数化测试:支持参数范围的自动测试和复杂度分析
  • 统计分析:提供均值、中位数、标准差等统计信息
  • 自定义计数器:允许用户定义和收集自定义性能指标
  • 复杂度分析:自动计算算法的时间复杂度(O(n), O(nlogn)等)
  • 跨平台支持:支持Linux、macOS、Windows等多个平台
  • 灵活的配置选项:可通过装饰器配置测试参数

安装指南

系统要求

  • C++11或更高版本的编译器
  • Python 3.6+(用于工具脚本)
  • CMake 3.10+(用于构建)

安装步骤

  1. 克隆项目仓库:
git clone https://github.com/google/benchmark.git
cd benchmark
  1. 创建构建目录并编译:
mkdir build && cd build
cmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON -DCMAKE_BUILD_TYPE=Release ..
make -j4
  1. 安装库文件:
sudo make install
  1. Python绑定安装(可选):
python setup.py install

依赖项

  • Google Test(可选,用于单元测试)
  • 线程库(pthreads等)

使用说明

基础用法

#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();

高级特性示例

#include <benchmark/benchmark.h>
#include <vector>// 参数化测试
static void BM_vector_push_back(benchmark::State& state) {for (auto _ : state) {std::vector<int> v;v.reserve(state.range(0));for (int i = 0; i < state.range(0); ++i) {v.push_back(i);}}state.SetComplexityN(state.range(0));
}BENCHMARK(BM_vector_push_back)->RangeMultiplier(2)->Range(1<<10, 1<<18)->Complexity(benchmark::oN);// 多线程测试
static void BM_parallel_work(benchmark::State& state) {for (auto _ : state) {std::vector<std::thread> threads;for (int i = 0; i < state.threads(); ++i) {threads.emplace_back([&] {// 并行工作volatile int x = 0;for (int j = 0; j < 1000000; ++j) {x += j;}});}for (auto& t : threads) {t.join();}}
}
BENCHMARK(BM_parallel_work)->ThreadRange(1, 8);BENCHMARK_MAIN();

Python绑定使用

import google_benchmark as benchmark
import random@benchmark.register
def sum_million(state):while state:sum(range(1_000_000))@benchmark.register
@benchmark.option.arg(100)
@benchmark.option.arg(1000)
def passing_argument(state):while state:sum(range(state.range(0)))if __name__ == "__main__":benchmark.main()

核心代码

基准测试状态管理

// benchmark/benchmark.h
class State {
public:// 迭代控制bool KeepRunning() {if (started_) {++total_iterations_;}started_ = true;if (total_iterations_ < max_iterations_) {return true;}// 计算时间统计Finish();return false;}// 暂停/恢复计时void PauseTiming() {if (running_) {running_ = false;pause_time_ = clock::now();}}void ResumeTiming() {if (!running_) {running_ = true;start_time_ += clock::now() - pause_time_;}}// 设置迭代时间void SetIterationTime(double seconds) {manual_time_used_ += seconds;}// 跳过测试void SkipWithError(const char* error) {error_occurred_ = true;error_message_ = error;}private:bool started_ = false;bool running_ = false;size_t total_iterations_ = 0;size_t max_iterations_ = 0;time_point start_time_;time_point pause_time_;double manual_time_used_ = 0.0;bool error_occurred_ = false;std::string error_message_;
};

复杂度计算实现

// complexity.h
struct LeastSq {LeastSq() : coef(0.0), rms(0.0), complexity(oNone) {}double coef;      // 高阶项系数估计double rms;       // 归一化均方根误差BigO complexity;  // 复杂度形式
};std::vector<BenchmarkReporter::Run> ComputeBigO(const std::vector<BenchmarkReporter::Run>& reports) {std::vector<BenchmarkReporter::Run> results;if (reports.size() < 2) {return results;  // 需要至少2个数据点}// 收集所有复杂度级别std::set<BigO> complexities;for (const auto& run : reports) {complexities.insert(run.complexity);}// 为每个复杂度计算最小二乘拟合for (BigO complexity : complexities) {auto it = MinimalLeastSq(reports, complexity);if (it.coef != 0.0) {BenchmarkReporter::Run r;r.complexity = complexity;r.coef = it.coef;r.rms = it.rms;results.push_back(r);}}return results;
}

多线程同步机制

// thread_manager.h
class ThreadManager {
public:explicit ThreadManager(int num_threads) : start_stop_barrier_(num_threads) {}// 线程同步屏障bool StartStopBarrier() { return start_stop_barrier_.wait(); }void NotifyThreadComplete() { start_stop_barrier_.removeThread(); }// 结果收集struct Result {IterationCount iterations = 0;double real_time_used = 0;double cpu_time_used = 0;double manual_time_used = 0;int64_t complexity_n = 0;UserCounters counters;};private:mutable Mutex benchmark_mutex_;Barrier start_stop_barrier_;Result results;
};

性能计数器支持

// perf_counters.h
class PerfCounterValues {
public:explicit PerfCounterValues(size_t nr_counters) : nr_counters_(nr_counters) {BM_CHECK_LE(nr_counters_, kMaxCounters);}// 读取性能计数器值uint64_t operator[](size_t idx) const {BM_CHECK_LT(idx, nr_counters_);return values_[kPaddingCounters + idx];}// 更新计数器值void Read() {if (nr_counters_ == 0) return;// 使用平台特定的性能计数器读取接口ReadPerfCounters(values_.data(), kPaddingCounters + nr_counters_);}private:static constexpr size_t kMaxCounters = 32;static constexpr size_t kPaddingCounters = 1;size_t nr_counters_;std::array<uint64_t, kPaddingCounters + kMaxCounters> values_;
};

Google Benchmark提供了完整的基准测试解决方案,从简单的函数计时到复杂的多线程性能分析,帮助开发者全面了解代码性能特征,为优化提供数据支持。
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)

公众号二维码

公众号二维码

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

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

相关文章

医疗小程序02用户注册 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

最全、最清晰、C++的 lower_bound / upper_bound 总结

最全、最清晰的 lower_bound / upper_bound 总结,包含: ✔ 功能解释(通俗 + STL 定义) ✔ 返回值含义 ✔ 典型代码例子 ✔ 在竞赛中的常用技巧 ✔ 与 equal_range 的关系 ✔ 可视化图示🔵 1. lower_bound / uppe…

密码系统设计实验3-2

密码系统设计实验3-2密码系统设计实验3-2

Mysql基础3 - 实践

Mysql基础3 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Co…

2025-12-01-Nature 本周最新文献速递

文章标题: Specificity, length and luck drive gene rankings in association studies 中文标题: 基因排名新洞察:特异性、长度与“运气”如何影响关联研究? 关键词: 全基因组关联研究、LoF负担测试、基因优先级、性…

论程序员的管理

我在it这个行业有10年左右的经验了,但我一直是个程序员。曾经一个程序员的管理人员,我的上级给我说过,程序员的管理是比较难的。 我想他这样说,一个原因是,程序员的工作成果是用代码说话的。但在编程的过程中,可…

缓解疲劳的方式有哪些?

1,睡眠质量。一些疲惫感的原因可能来源于睡眠质量不足,比如深度睡眠很少(低于20%),或者由于打呼噜、蒙着被子睡觉、睡姿压迫呼吸,导致睡眠时血氧不充分。 2,维生素摄入不充分。维生素B1缺乏与疲惫感正相关,因而…

LUA语法细节

1. 使用 nil 作比较时应该加上双引号:> type(X) nil > type(X)==nil false > type(X)=="nil" true2. Lua 把 false 和 nil 看作是"假",其他的都为"真":if false or nil then…

DevOps设备链对比,Azure 和 TikLab哪款更好用?

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Python 日期时间操作笔记

Python 日期时间操作笔记日期时间 Python 语言中,日期时间操作类(datetime)放在 datetime 包中, 需要导入 from datetime import datetime获取本地时间 获取本地日期时间(默认), datetime.now() 获取本地的日期时间…

The country with the largest area in the world

actually its USAmerica or British because the entire Pacific belongs to the USA, along with the Atlantic.

田径赛场飞驰 球类竞技闪耀

2025-11-30 10:30:00 田径赛场飞驰 球类竞技闪耀 |@bGf.2NdMeM.cOm@||@cUe.HyZxYs.cOm@||@cUh.HyZxYs.cOm@||@zAb.JiAnGYoUwL.cOm@||@dEh.2NdMeM.cOm@||@bHr.JtRuIkAnG.cOm@||@vWx.JiAnGYoUwL.cOm@||@dEa.2NdMeM.cOm@|…

一加ACE5 安装类原生系统 crDroid 12

一加ACE5 安装类原生系统 crDroid 12ACE5 安装 crDroid 12 文档地址 官方文档 Install crDroid 12 for OnePlus 13R https://crdroid.net/giulia/12/installXDA ROM 16 OnePlus 13R / Ace 5 crDroid v12 Official h…

绿茵赛场逐梦 热血竞技铸辉煌

2025-11-30 10:00:00 绿茵赛场逐梦 热血竞技铸辉煌|@dBi.DiNoObAbY.cOm@||@dBb.DiNoObAbY.cOm@||@dBu.DiNoObAbY.cOm@||@dBh.DiNoObAbY.cOm@||@dBa.DiNoObAbY.cOm@||@bHm.Hn-XyT.cOm@||@dBl.DiNoObAbY.cOm@||@dBg.DiNo…

在cline中使用多个OpenAI Compatible

1 在 cline 中使用多个 OpenAI Compatible 从这篇博文中获得了灵感,https://github.com/cline/cline/discussions/386 ,使用 litellm, docker 容器的方法(成功)) 借鉴 LiteLLM - 入门指南 | liteLLM 中文文档 。网…

2025年11月景区饮品供应商推荐榜单:一份基于市场数据与用户口碑的权威选择指南

随着旅游消费的持续复苏与消费者健康意识的提升,景区饮品供应已成为影响游客体验的关键环节。根据文化和旅游部数据,2025年上半年国内旅游总人次同比增长显著,景区二次消费需求呈现多元化趋势。多数景区管理者在选择…

2025年11月景区饮品供应商推荐:避坑要点与行业权威评测报告

随着旅游市场的快速复苏,景区商业配套服务品质成为影响游客体验的关键因素之一。作为景区服务链条中的重要环节,饮品供应不仅需要满足游客解渴纳凉的基本需求,更需契合健康消费升级的时代趋势。根据文化和旅游部公开…

域名解析工具nslookup和dig对比

域名解析工具nslookup和dig对比nslookup和dig默认都会输出所有解析地址,包括ipv4和ipv6。dig -4和-6表示分别只用ipv4和ipv6来解析地址,nslookup不支持。 root@root1:~# nslookup -debug www.baidu.com Server: …

2025年11月景区饮品供应商推荐榜单:一份基于市场数据的客观选择指南

随着旅游消费升级和健康意识增强,景区饮品供应商的角色正从单一产品提供者转变为综合解决方案服务商。根据文化和旅游部数据,2024年全国景区二次消费中饮品占比显著提升,消费者对健康属性、文化特色及供应链稳定性提…

springboot校园失物招领框架 微信小程序的设计与实现

springboot校园失物招领框架 微信小程序的设计与实现2025-11-30 17:40 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…