c++性能测试工具:google benchmark入门(二) (2)

error

为什么会这样呢?那是因为Range默认除了start和limit,中间的其余参数都会是某一个基底(base)的幂,基地默认为8,所以我们会看到64和512,它们分别是8的平方和立方。

想要改变这一行为也很简单,只要重新设置基底即可,通过使用RangeMultiplier方法:

BENCHMARK(bench_array_ring_insert_int)->RangeMultiplier(10)->Range(10, 1000);

现在结果恢复如初了。

使用Ranges可以处理多个参数的情况:

BENCHMARK(func)->RangeMultiplier(10)->Ranges({{10, 1000}, {128, 256}});

第一个范围指定了测试用例的第一个传入参数的范围,而第二个范围指定了第二个传入参数可能的值(注意这里不是范围了)。

与下面的代码等价:

BENCHMARK(func)->Args({10, 128}) ->Args({100, 128}) ->Args({1000, 128}) ->Args({10, 256}) ->Args({100, 256}) ->Args({1000, 256})

实际上就是用生成的第一个参数的范围于后面指定内容的参数做了一个笛卡尔积。

使用参数生成器

如果我想定制没有规律的更复杂的参数呢?这时就需要实现自定义的参数生成器了。

一个参数生成器的签名如下:

void CustomArguments(benchmark::internal::Benchmark* b);

我们在生成器中计算处参数,然后调用benchmark::internal::Benchmark对象的Arg或Args方法像上两节那样传入参数即可。

随后我们使用Apply方法把生成器应用到测试用例上:

BENCHMARK(func)->Apply(CustomArguments);

其实这一过程的原理并不复杂,我做个简单的解释:

BENCHMARK宏产生的就是一个benchmark::internal::Benchmark对象然后返回了它的指针

向benchmark::internal::Benchmark对象传递参数需要使用Arg和Args等方法

Apply方法会将参数中的函数应用在自身

我们在生成器里使用benchmark::internal::Benchmark对象的指针b的Args等方法传递参数,这时的b其实指向我们的测试用例

到此为止生成器是如何工作的已经一目了然了,当然从上面得出的结论,我们还可以让Apply做更多的事情。

下面看下Apply的具体使用:

// 这次我们生成100,200,...,1000的测试用例,用range是无法生成这些参数的 static void custom_args(benchmark::internal::Benchmark* b) { for (int i = 100; i <= 1000; i += 100) { b->Arg(i); } } BENCHMARK(bench_array_ring_insert_int)->RangeMultiplier(10)->Apply(custom_args);

自定义参数的测试结果:

custom_args

至此向测试用例传递参数的方法就全部介绍完了。

下一篇中我会介绍如何将测试用例写成模板,传递参数只能解决一部分重复代码,对于拥有类似方法的不同待测试类型的测试用例,使用模板将会大大减少我们不必要的工作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzzxz.html