上一篇中我们初步体验了google benchmark的使用,在本文中我们将更进一步深入了解google benchmark的常用方法。
本文索引
向测试用例传递参数
之前我们的测试用例都只接受一个 benchmark::State&
类型的参数,如果我们需要给测试用例传递额外的参数呢?
举个例子,假如我们需要实现一个队列,现在有ring buffer和linked list两种实现可选,现在我们要测试两种方案在不同情况下的性能表现:
// 必要的数据结构 #include "ring.h" #include "linked_ring.h" // ring buffer的测试 static void bench_array_ring_insert_int_10(benchmark::State& state) { auto ring = ArrayRing<int>(10); for (auto _: state) { for (int i = 1; i <= 10; ++i) { ring.insert(i); } state.PauseTiming(); // 暂停计时 ring.clear(); state.ResumeTiming(); // 恢复计时 } } BENCHMARK(bench_array_ring_insert_int_10); // linked list的测试 static void bench_linked_queue_insert_int_10(benchmark::State &state) { auto ring = LinkedRing<int>{}; for (auto _:state) { for (int i = 0; i < 10; ++i) { ring.insert(i); } state.PauseTiming(); ring.clear(); state.ResumeTiming(); } } BENCHMARK(bench_linked_queue_insert_int_10); // 还有针对删除的测试,以及针对string的测试,都是高度重复的代码,这里不再罗列
很显然,上面的测试除了被测试类型和插入的数据量之外没有任何区别,如果可以通过传入参数进行控制的话就可以少写大量重复的代码。
编写重复的代码是浪费时间,而且往往意味着你在做一件蠢事,google的工程师们当然早就注意到了这一点。虽然测试用例只能接受一个 bench