benchmark::State & benchmark 原理

benchmark::State

benchmark::State是Google Benchmark库中的一个核心类,用于管理单个基准测试的状态信息和控制基准测试的执行流程。在编写基准测试时,这个类提供了一套丰富的接口,允许用户获取测试循环的次数、调整测试参数、测量时间等,从而使基准测试既灵活又准确。以下是benchmark::State的一些主要用途和功能:

1. 控制测试循环

在基准测试中,通常需要重复执行某项操作多次以获得可靠的测量结果。benchmark::State通过一个迭代器来控制这个测试循环。例如:

for (auto _ : state) {
    // 需要测试性能的代码
}

这里的循环会自动根据测试的需要重复执行,直到Google Benchmark认为已经收集到足够的数据为止。

2. 测量时间

默认情况下,Google Benchmark会自动测量每次迭代的时间。然而,有时候我们可能需要排除一些准备工作的时间。此时,可以使用state.PauseTiming()state.ResumeTiming()来暂停和恢复计时:

for (auto _ : state) {
    state.PauseTiming();
    // 不需要计入时间的准备工作
    state.ResumeTiming();

    // 被测量的代码
}

3. 自定义指标

除了时间,你还可以通过state.counters来报告其他自定义指标。例如:

for (auto _ : state) {
    // 测试代码
    state.counters["MyMetric"] = 1.23; // 设置自定义指标
}

4. 处理参数化测试

当你使用参数化的基准测试时,可以通过state.range(0)等方法来获取测试参数的值,这对于执行需要不同输入大小的测试非常有用。

static void BM_SomeFunction(benchmark::State& state) {
  int input = state.range(0);
  for (auto _ : state) {
    // 使用input作为输入的测试代码
  }
}
BENCHMARK(BM_SomeFunction)->Arg(8)->Arg(64)->Arg(512); // 参数化测试

原理

C++中的基准测试(Benchmarking)主要是衡量某段代码或程序在特定条件下的性能表现,如执行时间、内存使用、CPU周期等。Google Benchmark是C++中常用的一个基准测试库,其原理和实现方式代表了C++基准测试的典型做法。以下是C++基准测试的一般原理和关键概念:

1. 重复执行:

基准测试通过重复执行被测代码多次来获得一个平均值,以减少测试结果的误差。由于操作系统和硬件的复杂性,单次执行的时间可能会受到很多因素的影响,重复执行可以帮助平滑这些随机波动。

2. 自动调整迭代次数:

为了确保测试结果的准确性,Google Benchmark等库会自动调整每个测试循环的迭代次数。库会根据前几次迭代的执行时间动态调整,以确保总的测试时间既不会太长,也足以获得稳定的性能数据。

3. 避免优化:

编译器的优化可能会改变代码的执行方式,甚至完全移除某些看似“无用”的代码。为了防止这种情况,基准测试库提供了特定的机制来“欺骗”编译器,防止它过度优化。例如,使用volatile关键字或者通过某些方法将结果输出到黑盒(black hole)函数。

4. 精确计时:

基准测试需要非常精确地测量时间。这通常通过使用操作系统提供的高精度计时器实现,如Linux上的clock_gettime或Windows上的QueryPerformanceCounter

5. 统计分析:

简单的平均值可能不足以反映真实的性能表现,因此高级的基准测试工具还会提供更多统计数据,如中位数、标准差等,以及运行结果的置信区间。这有助于更全面地了解性能特性。

6. 参数化测试:

对于需要测试不同输入或条件下性能的情况,基准测试库允许参数化测试,即同一段代码可以自动应用多组参数进行测试,方便评估在不同条件下的性能差异。

7. 隔离和控制:

为了确保测试结果的稳定和可比较,基准测试尽可能在隔离的环境下运行,并控制外部变量的干扰,如尝试禁用系统的动态频率调整等。

实现概览:

  • 测试循环: 通过编写特定的测试函数,并在函数体内使用循环,让Google Benchmark等库控制循环次数。
  • 计时和控制: 使用库提供的API进行精确计时,暂停计时(在准备阶段),以及恢复计时(在测试阶段)。
  • 结果报告: 最后,基凊测试库会收集所有迭代的执行时间,计算并报告最终的性能指标。
  • 27
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值