我如何告诉 Google Benchmark 不对一行代码进行基准测试?

How can I tell Google Benchmark to not benchmark a line of code?

我正在使用 Google Benchmark 对库进行基准测试。我的基准设置如下:

for (auto _ : state) {
    run_function(first, last, v);
}

我想要的是 v 在每次迭代时随机生成,这样我就可以获得一系列基准值并从中获取统计信息。我可以通过以下方式做到这一点:

std::random_device rand_dev;
std::mt19937 generator(rand_dev());
std::uniform_int_distribution<int>  distr(min, max);
for (auto _ : state) {
    v = distr(generator)
    run_function(first, last, v);
}

我测试的一些函数在10-100ns的数量级,所以加入生成器对结果有很大的影响。有什么方法可以告诉 Google Bench 跳过 line/block 代码吗?

不,它对整个循环的多次迭代进行计时,而不是在单个语句甚至整个迭代周围插入计时器 start/stop。

时间也很昂贵,例如即使是 x86 上的 rdtsc 也需要大约 20 个时钟周期,并且从中获得有用的结果需要序列化 ​​out-of-order 执行(例如使用 lfence),从而破坏每次迭代执行的多种循环的性能独立工作。因此,自行为短函数计时确实不太可行或不现实。 GoogleBenchmark 由您来构建一个循环,该循环对吞吐量(独立迭代)或延迟(将一个调用的输出提供给下一个 iter 的输入)进行基准测试。

必须弄清楚如何创建要进行基准测试的整个循环。

在这种情况下,使用非常便宜的 PRNG,例如 xorshift+

您可以在 State 对象上使用 PauseTimingResumeTiming 方法来暂停和恢复计时。但是,它可能会给定时循环带来一些开销。如果基准测试下的功能非常快,您可能会注意到它。