写点什么

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+(用于构建)

安装步骤

  1. 克隆项目仓库:


git clone https://github.com/google/benchmark.gitcd benchmark
复制代码


  1. 创建构建目录并编译:


mkdir build && cd buildcmake -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 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智能小助手


公众号二维码


网络安全技术点滴分享


用户头像

qife122

关注

还未添加个人签名 2021-05-19 加入

还未添加个人简介

评论

发布
暂无评论
Google Benchmark:高性能C++代码基准测试框架_c++_qife122_InfoQ写作社区