mirror of https://github.com/google/benchmark.git
Add macros for create benchmark with templated fixture (#451)
* Add macros for create benchmark with templated fixture * Add info about templated fixtures to README.md * Add tests for templated fixtures
This commit is contained in:
parent
2409cb2eb1
commit
819adb4cd1
25
README.md
25
README.md
|
@ -458,6 +458,31 @@ BENCHMARK_REGISTER_F(MyFixture, BarTest)->Threads(2);
|
||||||
/* BarTest is now registered */
|
/* BarTest is now registered */
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Templated fixtures
|
||||||
|
Also you can create templated fixture by using the following macros:
|
||||||
|
|
||||||
|
* `BENCHMARK_TEMPLATE_F(ClassName, Method, ...)`
|
||||||
|
* `BENCHMARK_TEMPLATE_DEFINE_F(ClassName, Method, ...)`
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```c++
|
||||||
|
template<typename T>
|
||||||
|
class MyFixture : public benchmark::Fixture {};
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE_F(MyFixture, IntTest, int)(benchmark::State& st) {
|
||||||
|
while (st.KeepRunning()) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE_DEFINE_F(MyFixture, DoubleTest, double)(benchmark::State& st) {
|
||||||
|
while (st.KeepRunning()) {
|
||||||
|
...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BENCHMARK_REGISTER_F(MyFixture, DoubleTest)->Threads(2);
|
||||||
|
```
|
||||||
|
|
||||||
## User-defined counters
|
## User-defined counters
|
||||||
|
|
||||||
|
|
|
@ -984,10 +984,63 @@ class Fixture : public internal::Benchmark {
|
||||||
virtual void BenchmarkCase(::benchmark::State&); \
|
virtual void BenchmarkCase(::benchmark::State&); \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
||||||
|
class BaseClass##_##Method##_Benchmark : public BaseClass<a> { \
|
||||||
|
public: \
|
||||||
|
BaseClass##_##Method##_Benchmark() : BaseClass<a>() { \
|
||||||
|
this->SetName(#BaseClass"<" #a ">/" #Method); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
protected: \
|
||||||
|
virtual void BenchmarkCase(::benchmark::State&); \
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
||||||
|
class BaseClass##_##Method##_Benchmark : public BaseClass<a, b> { \
|
||||||
|
public: \
|
||||||
|
BaseClass##_##Method##_Benchmark() : BaseClass<a, b>() { \
|
||||||
|
this->SetName(#BaseClass"<" #a "," #b ">/" #Method); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
protected: \
|
||||||
|
virtual void BenchmarkCase(::benchmark::State&); \
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef BENCHMARK_HAS_CXX11
|
||||||
|
#define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, ...) \
|
||||||
|
class BaseClass##_##Method##_Benchmark : public BaseClass<__VA_ARGS__> { \
|
||||||
|
public: \
|
||||||
|
BaseClass##_##Method##_Benchmark() : BaseClass<__VA_ARGS__>() { \
|
||||||
|
this->SetName(#BaseClass"<" #__VA_ARGS__ ">/" #Method); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
protected: \
|
||||||
|
virtual void BenchmarkCase(::benchmark::State&); \
|
||||||
|
};
|
||||||
|
#else
|
||||||
|
#define BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(n, a) BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(n, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BENCHMARK_DEFINE_F(BaseClass, Method) \
|
#define BENCHMARK_DEFINE_F(BaseClass, Method) \
|
||||||
BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
|
||||||
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a) \
|
||||||
|
BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE2_DEFINE_F(BaseClass, Method, a, b) \
|
||||||
|
BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#ifdef BENCHMARK_HAS_CXX11
|
||||||
|
#define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, ...) \
|
||||||
|
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
#else
|
||||||
|
#define BENCHMARK_TEMPLATE_DEFINE_F(BaseClass, Method, a) BENCHMARK_TEMPLATE1_DEFINE_F(BaseClass, Method, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define BENCHMARK_REGISTER_F(BaseClass, Method) \
|
#define BENCHMARK_REGISTER_F(BaseClass, Method) \
|
||||||
BENCHMARK_PRIVATE_REGISTER_F(BaseClass##_##Method##_Benchmark)
|
BENCHMARK_PRIVATE_REGISTER_F(BaseClass##_##Method##_Benchmark)
|
||||||
|
|
||||||
|
@ -1001,6 +1054,25 @@ class Fixture : public internal::Benchmark {
|
||||||
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||||
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE1_F(BaseClass, Method, a) \
|
||||||
|
BENCHMARK_TEMPLATE1_PRIVATE_DECLARE_F(BaseClass, Method, a) \
|
||||||
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#define BENCHMARK_TEMPLATE2_F(BaseClass, Method, a, b) \
|
||||||
|
BENCHMARK_TEMPLATE2_PRIVATE_DECLARE_F(BaseClass, Method, a, b) \
|
||||||
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
|
||||||
|
#ifdef BENCHMARK_HAS_CXX11
|
||||||
|
#define BENCHMARK_TEMPLATE_F(BaseClass, Method, ...) \
|
||||||
|
BENCHMARK_TEMPLATE_PRIVATE_DECLARE_F(BaseClass, Method, __VA_ARGS__) \
|
||||||
|
BENCHMARK_REGISTER_F(BaseClass, Method); \
|
||||||
|
void BaseClass##_##Method##_Benchmark::BenchmarkCase
|
||||||
|
#else
|
||||||
|
#define BENCHMARK_TEMPLATE_F(BaseClass, Method, a) BENCHMARK_TEMPLATE1_F(BaseClass, Method, a)
|
||||||
|
#endif
|
||||||
|
|
||||||
// Helper macro to create a main routine in a test that runs the benchmarks
|
// Helper macro to create a main routine in a test that runs the benchmarks
|
||||||
#define BENCHMARK_MAIN() \
|
#define BENCHMARK_MAIN() \
|
||||||
int main(int argc, char** argv) { \
|
int main(int argc, char** argv) { \
|
||||||
|
|
|
@ -98,6 +98,9 @@ add_test(multiple_ranges_test multiple_ranges_test --benchmark_min_time=0.01)
|
||||||
compile_output_test(reporter_output_test)
|
compile_output_test(reporter_output_test)
|
||||||
add_test(reporter_output_test reporter_output_test --benchmark_min_time=0.01)
|
add_test(reporter_output_test reporter_output_test --benchmark_min_time=0.01)
|
||||||
|
|
||||||
|
compile_output_test(templated_fixture_test)
|
||||||
|
add_test(templated_fixture_test templated_fixture_test --benchmark_min_time=0.01)
|
||||||
|
|
||||||
compile_output_test(user_counters_test)
|
compile_output_test(user_counters_test)
|
||||||
add_test(user_counters_test user_counters_test --benchmark_min_time=0.01)
|
add_test(user_counters_test user_counters_test --benchmark_min_time=0.01)
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,17 @@ void BM_template1(benchmark::State& state) {
|
||||||
BENCHMARK_TEMPLATE(BM_template1, long);
|
BENCHMARK_TEMPLATE(BM_template1, long);
|
||||||
BENCHMARK_TEMPLATE1(BM_template1, int);
|
BENCHMARK_TEMPLATE1(BM_template1, int);
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct BM_Fixture : public ::benchmark::Fixture {
|
||||||
|
};
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE_F(BM_Fixture, BM_template1, long)(benchmark::State& state) {
|
||||||
|
BM_empty(state);
|
||||||
|
}
|
||||||
|
BENCHMARK_TEMPLATE1_F(BM_Fixture, BM_template2, int)(benchmark::State& state) {
|
||||||
|
BM_empty(state);
|
||||||
|
}
|
||||||
|
|
||||||
void BM_counters(benchmark::State& state) {
|
void BM_counters(benchmark::State& state) {
|
||||||
BM_empty(state);
|
BM_empty(state);
|
||||||
state.counters["Foo"] = 2;
|
state.counters["Foo"] = 2;
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
|
||||||
|
#include "benchmark/benchmark.h"
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
class MyFixture : public ::benchmark::Fixture {
|
||||||
|
public:
|
||||||
|
MyFixture() : data(0) {}
|
||||||
|
|
||||||
|
T data;
|
||||||
|
};
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE_F(MyFixture, Foo, int)(benchmark::State &st) {
|
||||||
|
while (st.KeepRunning()) {
|
||||||
|
data += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BENCHMARK_TEMPLATE_DEFINE_F(MyFixture, Bar, double)(benchmark::State& st) {
|
||||||
|
while (st.KeepRunning()) {
|
||||||
|
data += 1.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BENCHMARK_REGISTER_F(MyFixture, Bar);
|
||||||
|
|
||||||
|
BENCHMARK_MAIN()
|
Loading…
Reference in New Issue