0

我正在使用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 跳过一行/代码块?

4

2 回答 2

4

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

于 2020-10-27T20:34:09.400 回答
-1

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

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

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

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

于 2020-10-26T22:37:25.893 回答