Home | History | Annotate | Download | only in benchmark
      1 // Support for registering benchmarks for functions.
      2 
      3 /* Example usage:
      4 // Define a function that executes the code to be measured a
      5 // specified number of times:
      6 static void BM_StringCreation(benchmark::State& state) {
      7   while (state.KeepRunning())
      8     std::string empty_string;
      9 }
     10 
     11 // Register the function as a benchmark
     12 BENCHMARK(BM_StringCreation);
     13 
     14 // Define another benchmark
     15 static void BM_StringCopy(benchmark::State& state) {
     16   std::string x = "hello";
     17   while (state.KeepRunning())
     18     std::string copy(x);
     19 }
     20 BENCHMARK(BM_StringCopy);
     21 
     22 // Augment the main() program to invoke benchmarks if specified
     23 // via the --benchmarks command line flag.  E.g.,
     24 //       my_unittest --benchmark_filter=all
     25 //       my_unittest --benchmark_filter=BM_StringCreation
     26 //       my_unittest --benchmark_filter=String
     27 //       my_unittest --benchmark_filter='Copy|Creation'
     28 int main(int argc, char** argv) {
     29   benchmark::Initialize(&argc, argv);
     30   benchmark::RunSpecifiedBenchmarks();
     31   return 0;
     32 }
     33 
     34 // Sometimes a family of microbenchmarks can be implemented with
     35 // just one routine that takes an extra argument to specify which
     36 // one of the family of benchmarks to run.  For example, the following
     37 // code defines a family of microbenchmarks for measuring the speed
     38 // of memcpy() calls of different lengths:
     39 
     40 static void BM_memcpy(benchmark::State& state) {
     41   char* src = new char[state.range_x()]; char* dst = new char[state.range_x()];
     42   memset(src, 'x', state.range_x());
     43   while (state.KeepRunning())
     44     memcpy(dst, src, state.range_x());
     45   state.SetBytesProcessed(int64_t(state.iterations()) *
     46                           int64_t(state.range_x()));
     47   delete[] src; delete[] dst;
     48 }
     49 BENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(1<<10)->Arg(8<<10);
     50 
     51 // The preceding code is quite repetitive, and can be replaced with the
     52 // following short-hand.  The following invocation will pick a few
     53 // appropriate arguments in the specified range and will generate a
     54 // microbenchmark for each such argument.
     55 BENCHMARK(BM_memcpy)->Range(8, 8<<10);
     56 
     57 // You might have a microbenchmark that depends on two inputs.  For
     58 // example, the following code defines a family of microbenchmarks for
     59 // measuring the speed of set insertion.
     60 static void BM_SetInsert(benchmark::State& state) {
     61   while (state.KeepRunning()) {
     62     state.PauseTiming();
     63     set<int> data = ConstructRandomSet(state.range_x());
     64     state.ResumeTiming();
     65     for (int j = 0; j < state.range_y(); ++j)
     66       data.insert(RandomNumber());
     67   }
     68 }
     69 BENCHMARK(BM_SetInsert)
     70    ->ArgPair(1<<10, 1)
     71    ->ArgPair(1<<10, 8)
     72    ->ArgPair(1<<10, 64)
     73    ->ArgPair(1<<10, 512)
     74    ->ArgPair(8<<10, 1)
     75    ->ArgPair(8<<10, 8)
     76    ->ArgPair(8<<10, 64)
     77    ->ArgPair(8<<10, 512);
     78 
     79 // The preceding code is quite repetitive, and can be replaced with
     80 // the following short-hand.  The following macro will pick a few
     81 // appropriate arguments in the product of the two specified ranges
     82 // and will generate a microbenchmark for each such pair.
     83 BENCHMARK(BM_SetInsert)->RangePair(1<<10, 8<<10, 1, 512);
     84 
     85 // For more complex patterns of inputs, passing a custom function
     86 // to Apply allows programmatic specification of an
     87 // arbitrary set of arguments to run the microbenchmark on.
     88 // The following example enumerates a dense range on
     89 // one parameter, and a sparse range on the second.
     90 static void CustomArguments(benchmark::internal::Benchmark* b) {
     91   for (int i = 0; i <= 10; ++i)
     92     for (int j = 32; j <= 1024*1024; j *= 8)
     93       b->ArgPair(i, j);
     94 }
     95 BENCHMARK(BM_SetInsert)->Apply(CustomArguments);
     96 
     97 // Templated microbenchmarks work the same way:
     98 // Produce then consume 'size' messages 'iters' times
     99 // Measures throughput in the absence of multiprogramming.
    100 template <class Q> int BM_Sequential(benchmark::State& state) {
    101   Q q;
    102   typename Q::value_type v;
    103   while (state.KeepRunning()) {
    104     for (int i = state.range_x(); i--; )
    105       q.push(v);
    106     for (int e = state.range_x(); e--; )
    107       q.Wait(&v);
    108   }
    109   // actually messages, not bytes:
    110   state.SetBytesProcessed(
    111       static_cast<int64_t>(state.iterations())*state.range_x());
    112 }
    113 BENCHMARK_TEMPLATE(BM_Sequential, WaitQueue<int>)->Range(1<<0, 1<<10);
    114 
    115 Use `Benchmark::MinTime(double t)` to set the minimum time used to run the
    116 benchmark. This option overrides the `benchmark_min_time` flag.
    117 
    118 void BM_test(benchmark::State& state) {
    119  ... body ...
    120 }
    121 BENCHMARK(BM_test)->MinTime(2.0); // Run for at least 2 seconds.
    122 
    123 In a multithreaded test, it is guaranteed that none of the threads will start
    124 until all have called KeepRunning, and all will have finished before KeepRunning
    125 returns false. As such, any global setup or teardown you want to do can be
    126 wrapped in a check against the thread index:
    127 
    128 static void BM_MultiThreaded(benchmark::State& state) {
    129   if (state.thread_index == 0) {
    130     // Setup code here.
    131   }
    132   while (state.KeepRunning()) {
    133     // Run the test as normal.
    134   }
    135   if (state.thread_index == 0) {
    136     // Teardown code here.
    137   }
    138 }
    139 BENCHMARK(BM_MultiThreaded)->Threads(4);
    140 */
    141 
    142 #ifndef BENCHMARK_BENCHMARK_API_H_
    143 #define BENCHMARK_BENCHMARK_API_H_
    144 
    145 #include <assert.h>
    146 #include <stddef.h>
    147 #include <stdint.h>
    148 
    149 #include "macros.h"
    150 
    151 namespace benchmark {
    152 class BenchmarkReporter;
    153 
    154 void Initialize(int* argc, char** argv);
    155 
    156 // Otherwise, run all benchmarks specified by the --benchmark_filter flag,
    157 // and exit after running the benchmarks.
    158 void RunSpecifiedBenchmarks();
    159 void RunSpecifiedBenchmarks(BenchmarkReporter* reporter);
    160 
    161 // If this routine is called, peak memory allocation past this point in the
    162 // benchmark is reported at the end of the benchmark report line. (It is
    163 // computed by running the benchmark once with a single iteration and a memory
    164 // tracer.)
    165 // TODO(dominic)
    166 // void MemoryUsage();
    167 
    168 namespace internal {
    169 class Benchmark;
    170 class BenchmarkImp;
    171 class BenchmarkFamilies;
    172 
    173 template <class T> struct Voider {
    174     typedef void type;
    175 };
    176 
    177 template <class T, class = void>
    178 struct EnableIfString {};
    179 
    180 template <class T>
    181 struct EnableIfString<T, typename Voider<typename T::basic_string>::type> {
    182     typedef int type;
    183 };
    184 
    185 void UseCharPointer(char const volatile*);
    186 
    187 // Take ownership of the pointer and register the benchmark. Return the
    188 // registered benchmark.
    189 Benchmark* RegisterBenchmarkInternal(Benchmark*);
    190 
    191 } // end namespace internal
    192 
    193 
    194 // The DoNotOptimize(...) function can be used to prevent a value or
    195 // expression from being optimized away by the compiler. This function is
    196 // intented to add little to no overhead.
    197 // See: http://stackoverflow.com/questions/28287064
    198 #if defined(__clang__) && defined(__GNUC__)
    199 // TODO(ericwf): Clang has a bug where it tries to always use a register
    200 // even if value must be stored in memory. This causes codegen to fail.
    201 // To work around this we remove the "r" modifier so the operand is always
    202 // loaded into memory.
    203 template <class Tp>
    204 inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
    205     asm volatile("" : "+m" (const_cast<Tp&>(value)));
    206 }
    207 #elif defined(__GNUC__)
    208 template <class Tp>
    209 inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
    210     asm volatile("" : "+rm" (const_cast<Tp&>(value)));
    211 }
    212 #else
    213 template <class Tp>
    214 inline BENCHMARK_ALWAYS_INLINE void DoNotOptimize(Tp const& value) {
    215     internal::UseCharPointer(&reinterpret_cast<char const volatile&>(value));
    216 }
    217 #endif
    218 
    219 
    220 // State is passed to a running Benchmark and contains state for the
    221 // benchmark to use.
    222 class State {
    223 public:
    224   State(size_t max_iters, bool has_x, int x, bool has_y, int y, int thread_i, int n_threads);
    225 
    226   // Returns true iff the benchmark should continue through another iteration.
    227   // NOTE: A benchmark may not return from the test until KeepRunning() has
    228   // returned false.
    229   bool KeepRunning() {
    230     if (BENCHMARK_BUILTIN_EXPECT(!started_, false)) {
    231         ResumeTiming();
    232         started_ = true;
    233     }
    234     bool const res = total_iterations_++ < max_iterations;
    235     if (BENCHMARK_BUILTIN_EXPECT(!res, false)) {
    236         assert(started_);
    237         PauseTiming();
    238         // Total iterations now is one greater than max iterations. Fix this.
    239         total_iterations_ = max_iterations;
    240     }
    241     return res;
    242   }
    243 
    244   // REQUIRES: timer is running
    245   // Stop the benchmark timer.  If not called, the timer will be
    246   // automatically stopped after KeepRunning() returns false for the first time.
    247   //
    248   // For threaded benchmarks the PauseTiming() function acts
    249   // like a barrier.  I.e., the ith call by a particular thread to this
    250   // function will block until all threads have made their ith call.
    251   // The timer will stop when the last thread has called this function.
    252   //
    253   // NOTE: PauseTiming()/ResumeTiming() are relatively
    254   // heavyweight, and so their use should generally be avoided
    255   // within each benchmark iteration, if possible.
    256   void PauseTiming();
    257 
    258   // REQUIRES: timer is not running
    259   // Start the benchmark timer.  The timer is NOT running on entrance to the
    260   // benchmark function. It begins running after the first call to KeepRunning()
    261   //
    262   // For threaded benchmarks the ResumeTiming() function acts
    263   // like a barrier.  I.e., the ith call by a particular thread to this
    264   // function will block until all threads have made their ith call.
    265   // The timer will start when the last thread has called this function.
    266   //
    267   // NOTE: PauseTiming()/ResumeTiming() are relatively
    268   // heavyweight, and so their use should generally be avoided
    269   // within each benchmark iteration, if possible.
    270   void ResumeTiming();
    271 
    272   // Set the number of bytes processed by the current benchmark
    273   // execution.  This routine is typically called once at the end of a
    274   // throughput oriented benchmark.  If this routine is called with a
    275   // value > 0, the report is printed in MB/sec instead of nanoseconds
    276   // per iteration.
    277   //
    278   // REQUIRES: a benchmark has exited its KeepRunning loop.
    279   BENCHMARK_ALWAYS_INLINE
    280   void SetBytesProcessed(size_t bytes) {
    281     bytes_processed_ = bytes;
    282   }
    283 
    284   BENCHMARK_ALWAYS_INLINE
    285   size_t bytes_processed() const {
    286     return bytes_processed_;
    287   }
    288 
    289   // If this routine is called with items > 0, then an items/s
    290   // label is printed on the benchmark report line for the currently
    291   // executing benchmark. It is typically called at the end of a processing
    292   // benchmark where a processing items/second output is desired.
    293   //
    294   // REQUIRES: a benchmark has exited its KeepRunning loop.
    295   BENCHMARK_ALWAYS_INLINE
    296   void SetItemsProcessed(size_t items) {
    297     items_processed_ = items;
    298   }
    299 
    300   BENCHMARK_ALWAYS_INLINE
    301   size_t items_processed() const {
    302     return items_processed_;
    303   }
    304 
    305   // If this routine is called, the specified label is printed at the
    306   // end of the benchmark report line for the currently executing
    307   // benchmark.  Example:
    308   //  static void BM_Compress(int iters) {
    309   //    ...
    310   //    double compress = input_size / output_size;
    311   //    benchmark::SetLabel(StringPrintf("compress:%.1f%%", 100.0*compression));
    312   //  }
    313   // Produces output that looks like:
    314   //  BM_Compress   50         50   14115038  compress:27.3%
    315   //
    316   // REQUIRES: a benchmark has exited its KeepRunning loop.
    317   void SetLabel(const char* label);
    318 
    319   // Allow the use of std::string without actually including <string>.
    320   // This function does not participate in overload resolution unless StringType
    321   // has the nested typename `basic_string`. This typename should be provided
    322   // as an injected class name in the case of std::string.
    323   template <class StringType>
    324   void SetLabel(StringType const & str,
    325                 typename internal::EnableIfString<StringType>::type = 1) {
    326     this->SetLabel(str.c_str());
    327   }
    328 
    329   // Range arguments for this run. CHECKs if the argument has been set.
    330   BENCHMARK_ALWAYS_INLINE
    331   int range_x() const {
    332     assert(has_range_x_);
    333     ((void)has_range_x_); // Prevent unused warning.
    334     return range_x_;
    335   }
    336 
    337   BENCHMARK_ALWAYS_INLINE
    338   int range_y() const {
    339     assert(has_range_y_);
    340     ((void)has_range_y_); // Prevent unused warning.
    341     return range_y_;
    342   }
    343 
    344   BENCHMARK_ALWAYS_INLINE
    345   size_t iterations() const { return total_iterations_; }
    346 
    347 private:
    348   bool started_;
    349   size_t total_iterations_;
    350 
    351   bool has_range_x_;
    352   int range_x_;
    353 
    354   bool has_range_y_;
    355   int range_y_;
    356 
    357   size_t bytes_processed_;
    358   size_t items_processed_;
    359 
    360 public:
    361   // Index of the executing thread. Values from [0, threads).
    362   const int thread_index;
    363   // Number of threads concurrently executing the benchmark.
    364   const int threads;
    365   const size_t max_iterations;
    366 
    367 private:
    368   BENCHMARK_DISALLOW_COPY_AND_ASSIGN(State);
    369 };
    370 
    371 namespace internal {
    372 
    373 typedef void(Function)(State&);
    374 
    375 // ------------------------------------------------------
    376 // Benchmark registration object.  The BENCHMARK() macro expands
    377 // into an internal::Benchmark* object.  Various methods can
    378 // be called on this object to change the properties of the benchmark.
    379 // Each method returns "this" so that multiple method calls can
    380 // chained into one expression.
    381 class Benchmark {
    382 public:
    383   virtual ~Benchmark();
    384 
    385   // Note: the following methods all return "this" so that multiple
    386   // method calls can be chained together in one expression.
    387 
    388   // Run this benchmark once with "x" as the extra argument passed
    389   // to the function.
    390   // REQUIRES: The function passed to the constructor must accept an arg1.
    391   Benchmark* Arg(int x);
    392 
    393   // Run this benchmark once for a number of values picked from the
    394   // range [start..limit].  (start and limit are always picked.)
    395   // REQUIRES: The function passed to the constructor must accept an arg1.
    396   Benchmark* Range(int start, int limit);
    397 
    398   // Run this benchmark once for every value in the range [start..limit]
    399   // REQUIRES: The function passed to the constructor must accept an arg1.
    400   Benchmark* DenseRange(int start, int limit);
    401 
    402   // Run this benchmark once with "x,y" as the extra arguments passed
    403   // to the function.
    404   // REQUIRES: The function passed to the constructor must accept arg1,arg2.
    405   Benchmark* ArgPair(int x, int y);
    406 
    407   // Pick a set of values A from the range [lo1..hi1] and a set
    408   // of values B from the range [lo2..hi2].  Run the benchmark for
    409   // every pair of values in the cartesian product of A and B
    410   // (i.e., for all combinations of the values in A and B).
    411   // REQUIRES: The function passed to the constructor must accept arg1,arg2.
    412   Benchmark* RangePair(int lo1, int hi1, int lo2, int hi2);
    413 
    414   // Pass this benchmark object to *func, which can customize
    415   // the benchmark by calling various methods like Arg, ArgPair,
    416   // Threads, etc.
    417   Benchmark* Apply(void (*func)(Benchmark* benchmark));
    418 
    419   // Set the minimum amount of time to use when running this benchmark. This
    420   // option overrides the `benchmark_min_time` flag.
    421   Benchmark* MinTime(double t);
    422 
    423   // If a particular benchmark is I/O bound, runs multiple threads internally or
    424   // if for some reason CPU timings are not representative, call this method. If
    425   // called, the elapsed time will be used to control how many iterations are
    426   // run, and in the printing of items/second or MB/seconds values.  If not
    427   // called, the cpu time used by the benchmark will be used.
    428   Benchmark* UseRealTime();
    429 
    430   // Support for running multiple copies of the same benchmark concurrently
    431   // in multiple threads.  This may be useful when measuring the scaling
    432   // of some piece of code.
    433 
    434   // Run one instance of this benchmark concurrently in t threads.
    435   Benchmark* Threads(int t);
    436 
    437   // Pick a set of values T from [min_threads,max_threads].
    438   // min_threads and max_threads are always included in T.  Run this
    439   // benchmark once for each value in T.  The benchmark run for a
    440   // particular value t consists of t threads running the benchmark
    441   // function concurrently.  For example, consider:
    442   //    BENCHMARK(Foo)->ThreadRange(1,16);
    443   // This will run the following benchmarks:
    444   //    Foo in 1 thread
    445   //    Foo in 2 threads
    446   //    Foo in 4 threads
    447   //    Foo in 8 threads
    448   //    Foo in 16 threads
    449   Benchmark* ThreadRange(int min_threads, int max_threads);
    450 
    451   // Equivalent to ThreadRange(NumCPUs(), NumCPUs())
    452   Benchmark* ThreadPerCpu();
    453 
    454   virtual void Run(State& state) = 0;
    455 
    456   // Used inside the benchmark implementation
    457   struct Instance;
    458 
    459 protected:
    460   explicit Benchmark(const char* name);
    461   Benchmark(Benchmark const&);
    462   void SetName(const char* name);
    463 
    464 private:
    465   friend class BenchmarkFamilies;
    466   BenchmarkImp* imp_;
    467 
    468   Benchmark& operator=(Benchmark const&);
    469 };
    470 
    471 // The class used to hold all Benchmarks created from static function.
    472 // (ie those created using the BENCHMARK(...) macros.
    473 class FunctionBenchmark : public Benchmark {
    474 public:
    475     FunctionBenchmark(const char* name, Function* func)
    476         : Benchmark(name), func_(func)
    477     {}
    478 
    479     virtual void Run(State& st);
    480 private:
    481     Function* func_;
    482 };
    483 
    484 }  // end namespace internal
    485 
    486 // The base class for all fixture tests.
    487 class Fixture: public internal::Benchmark {
    488 public:
    489     Fixture() : internal::Benchmark("") {}
    490 
    491     virtual void Run(State& st) {
    492       this->SetUp(st);
    493       this->BenchmarkCase(st);
    494       this->TearDown();
    495     }
    496 
    497     virtual void SetUp(const State&) {}
    498     virtual void TearDown() {}
    499 
    500 protected:
    501     virtual void BenchmarkCase(State&) = 0;
    502 };
    503 
    504 }  // end namespace benchmark
    505 
    506 
    507 // ------------------------------------------------------
    508 // Macro to register benchmarks
    509 
    510 // Check that __COUNTER__ is defined and that __COUNTER__ increases by 1
    511 // every time it is expanded. X + 1 == X + 0 is used in case X is defined to be
    512 // empty. If X is empty the expression becomes (+1 == +0).
    513 #if defined(__COUNTER__) && (__COUNTER__ + 1 == __COUNTER__ + 0)
    514 #define BENCHMARK_PRIVATE_UNIQUE_ID __COUNTER__
    515 #else
    516 #define BENCHMARK_PRIVATE_UNIQUE_ID __LINE__
    517 #endif
    518 
    519 // Helpers for generating unique variable names
    520 #define BENCHMARK_PRIVATE_NAME(n) \
    521     BENCHMARK_PRIVATE_CONCAT(_benchmark_, BENCHMARK_PRIVATE_UNIQUE_ID, n)
    522 #define BENCHMARK_PRIVATE_CONCAT(a, b, c) BENCHMARK_PRIVATE_CONCAT2(a, b, c)
    523 #define BENCHMARK_PRIVATE_CONCAT2(a, b, c) a##b##c
    524 
    525 #define BENCHMARK_PRIVATE_DECLARE(n)       \
    526   static ::benchmark::internal::Benchmark* \
    527   BENCHMARK_PRIVATE_NAME(n) BENCHMARK_UNUSED
    528 
    529 #define BENCHMARK(n) \
    530     BENCHMARK_PRIVATE_DECLARE(n) =                               \
    531         (::benchmark::internal::RegisterBenchmarkInternal(       \
    532             new ::benchmark::internal::FunctionBenchmark(#n, n)))
    533 
    534 // Old-style macros
    535 #define BENCHMARK_WITH_ARG(n, a) BENCHMARK(n)->Arg((a))
    536 #define BENCHMARK_WITH_ARG2(n, a1, a2) BENCHMARK(n)->ArgPair((a1), (a2))
    537 #define BENCHMARK_RANGE(n, lo, hi) BENCHMARK(n)->Range((lo), (hi))
    538 #define BENCHMARK_RANGE2(n, l1, h1, l2, h2) \
    539   BENCHMARK(n)->RangePair((l1), (h1), (l2), (h2))
    540 
    541 // This will register a benchmark for a templatized function.  For example:
    542 //
    543 // template<int arg>
    544 // void BM_Foo(int iters);
    545 //
    546 // BENCHMARK_TEMPLATE(BM_Foo, 1);
    547 //
    548 // will register BM_Foo<1> as a benchmark.
    549 #define BENCHMARK_TEMPLATE1(n, a) \
    550   BENCHMARK_PRIVATE_DECLARE(n) =  \
    551       (::benchmark::internal::RegisterBenchmarkInternal( \
    552         new ::benchmark::internal::FunctionBenchmark(#n "<" #a ">", n<a>)))
    553 
    554 #define BENCHMARK_TEMPLATE2(n, a, b)                     \
    555   BENCHMARK_PRIVATE_DECLARE(n) =                         \
    556       (::benchmark::internal::RegisterBenchmarkInternal( \
    557         new ::benchmark::internal::FunctionBenchmark(    \
    558             #n "<" #a "," #b ">", n<a, b>)))
    559 
    560 #if __cplusplus >= 201103L
    561 #define BENCHMARK_TEMPLATE(n, ...)           \
    562   BENCHMARK_PRIVATE_DECLARE(n) =             \
    563       (::benchmark::internal::RegisterBenchmarkInternal( \
    564         new ::benchmark::internal::FunctionBenchmark( \
    565         #n "<" #__VA_ARGS__ ">", n<__VA_ARGS__>)))
    566 #else
    567 #define BENCHMARK_TEMPLATE(n, a) BENCHMARK_TEMPLATE1(n, a)
    568 #endif
    569 
    570 
    571 #define BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method)      \
    572 class BaseClass##_##Method##_Benchmark : public BaseClass { \
    573 public:                                                     \
    574     BaseClass##_##Method##_Benchmark() : BaseClass() {      \
    575         this->SetName(#BaseClass "/" #Method);}             \
    576 protected:                                                  \
    577     virtual void BenchmarkCase(::benchmark::State&);        \
    578 };
    579 
    580 #define BENCHMARK_DEFINE_F(BaseClass, Method) \
    581     BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
    582     void BaseClass##_##Method##_Benchmark::BenchmarkCase
    583 
    584 #define BENCHMARK_REGISTER_F(BaseClass, Method) \
    585     BENCHMARK_PRIVATE_REGISTER_F(BaseClass##_##Method##_Benchmark)
    586 
    587 #define BENCHMARK_PRIVATE_REGISTER_F(TestName) \
    588     BENCHMARK_PRIVATE_DECLARE(TestName) = \
    589         (::benchmark::internal::RegisterBenchmarkInternal(new TestName()))
    590 
    591 // This macro will define and register a benchmark within a fixture class.
    592 #define BENCHMARK_F(BaseClass, Method) \
    593     BENCHMARK_PRIVATE_DECLARE_F(BaseClass, Method) \
    594     BENCHMARK_REGISTER_F(BaseClass, Method); \
    595     void BaseClass##_##Method##_Benchmark::BenchmarkCase
    596 
    597 
    598 // Helper macro to create a main routine in a test that runs the benchmarks
    599 #define BENCHMARK_MAIN()                   \
    600   int main(int argc, char** argv) {        \
    601     ::benchmark::Initialize(&argc, argv);  \
    602     ::benchmark::RunSpecifiedBenchmarks(); \
    603   }
    604 
    605 #endif  // BENCHMARK_BENCHMARK_API_H_
    606