Google Benchmark:高性能 C++ 代码基准测试框架
作者:qife122
- 2025-11-30 福建
本文字数:3490 字
阅读完需:约 11 分钟
Google Benchmark:高性能 C++代码基准测试框架
项目描述
Google Benchmark 是一个专业的 C++微基准测试库,由 Google 开发并开源。该项目提供了精确的性能测量工具,支持复杂的统计分析、多线程测试和算法复杂度计算。通过简单的 API,开发者可以轻松编写和运行基准测试,获取可靠的性能数据来优化代码。
功能特性
精确计时测量:支持实时时间、CPU 时间和手动时间测量
多线程基准测试:内置多线程支持,可测试并发性能
参数化测试:支持参数范围的自动测试和复杂度分析
统计分析:提供均值、中位数、标准差等统计信息
自定义计数器:允许用户定义和收集自定义性能指标
复杂度分析:自动计算算法的时间复杂度(O(n), O(nlogn)等)
跨平台支持:支持 Linux、macOS、Windows 等多个平台
灵活的配置选项:可通过装饰器配置测试参数
安装指南
系统要求
C++11 或更高版本的编译器
Python 3.6+(用于工具脚本)
CMake 3.10+(用于构建)
安装步骤
克隆项目仓库:
git clone https://github.com/google/benchmark.gitcd benchmark
复制代码
创建构建目录并编译:
mkdir build && cd buildcmake -DBENCHMARK_DOWNLOAD_DEPENDENCIES=ON -DCMAKE_BUILD_TYPE=Release ..make -j4
复制代码
安装库文件:
sudo make install
复制代码
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 benchmarkimport random
@benchmark.registerdef 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.hclass 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.hstruct 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.hclass 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.hclass 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 智能小助手)对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码
办公AI智能小助手
公众号二维码
网络安全技术点滴分享
划线
评论
复制
发布于: 刚刚阅读数: 3
qife122
关注
还未添加个人签名 2021-05-19 加入
还未添加个人简介







评论