我如何告诉 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
对象上使用 PauseTiming
和 ResumeTiming
方法来暂停和恢复计时。但是,它可能会给定时循环带来一些开销。如果基准测试下的功能非常快,您可能会注意到它。
我正在使用 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
对象上使用 PauseTiming
和 ResumeTiming
方法来暂停和恢复计时。但是,它可能会给定时循环带来一些开销。如果基准测试下的功能非常快,您可能会注意到它。