您以错误的方式使用了
BENCHMARK_TEMPLATE
和您的。
BENCHMARK_TEMPLATE(BM_PowTemplated, float, double, long double);
https://github.com/google/benchmark/ 的自述文件说:
template <class Q> int BM_Sequential(benchmark::State& state) { .. }
BENCHMARK_TEMPLATE(BM_Sequential, WaitQueue<int>)->Range(1<<0, 1<<10);
Three macros are provided for adding benchmark templates.
#define BENCHMARK_TEMPLATE(func, ...)
#define BENCHMARK_TEMPLATE1(func, arg1)
#define BENCHMARK_TEMPLATE2(func, arg1, arg2)
因此,对于具有一个模板参数的函数,使用带有arg1的BENCHMARK_TEMPLATE
,对于具有两个模板参数的函数,使用带有arg1和arg2的BENCHMARK_TEMPLATE
。由于您的BM_PowTemplated
只有一个参数,因此无法使用带有3个参数的BENCHMARK_TEMPLATE
。
请查看google/benchmark的test/cxx03_test.cc
示例:https://github.com/google/benchmark/blob/b2e734087532897b7bb4c51a6b4f503060c9a20f/test/cxx03_test.cc
template <class T, class U>
void BM_template2(benchmark::State& state) {
BM_empty(state);
}
BENCHMARK_TEMPLATE2(BM_template2, int, long);
template <class T>
void BM_template1(benchmark::State& state) {
BM_empty(state);
}
BENCHMARK_TEMPLATE(BM_template1, long);
BENCHMARK_TEMPLATE1(BM_template1, int);
PS:宏定义的定义:https://github.com/google/benchmark/blob/2d088a9f2d41acb77afc99d045f669e1a21b61ef/include/benchmark/benchmark_api.h#L684
我们可以看到,宏的a
(a,b
)参数放在<
和>
中,并且它们被用作f<a,b>
:
BENCHMARK_PRIVATE_DECLARE(n) = \
(::benchmark::internal::RegisterBenchmarkInternal( \
new ::benchmark::internal::FunctionBenchmark(#n "<" #a ">", n<a>)))
BENCHMARK_PRIVATE_DECLARE(n) = \
(::benchmark::internal::RegisterBenchmarkInternal( \
new ::benchmark::internal::FunctionBenchmark( \
#n "<" #a "," #b ">", n<a, b>)))
BENCHMARK_PRIVATE_DECLARE(n) = \
(::benchmark::internal::RegisterBenchmarkInternal( \
new ::benchmark::internal::FunctionBenchmark( \
#n "<" #__VA_ARGS__ ">", n<__VA_ARGS__>)))
因此,
BENCHMARK_TEMPLATE
无法在多个变量上迭代并从一行中定义您的函数的多个变体。