12ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Copyright 2009 The RE2 Authors.  All Rights Reserved.
22ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// Use of this source code is governed by a BSD-style
32ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson// license that can be found in the LICENSE file.
42ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
52ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#ifndef RE2_UTIL_BENCHMARK_H__
62ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define RE2_UTIL_BENCHMARK_H__
72ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
82ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonnamespace testing {
92ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonstruct Benchmark {
102ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  const char* name;
112ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void (*fn)(int);
122ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void (*fnr)(int, int);
132ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  int lo;
142ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  int hi;
152ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  int threadlo;
162ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  int threadhi;
172ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
182ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void Register();
192ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  Benchmark(const char* name, void (*f)(int)) { Clear(name); fn = f; Register(); }
202ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  Benchmark(const char* name, void (*f)(int, int), int l, int h) { Clear(name); fnr = f; lo = l; hi = h; Register(); }
212ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  void Clear(const char* n) { name = n; fn = 0; fnr = 0; lo = 0; hi = 0; threadlo = 0; threadhi = 0; }
222ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson  Benchmark* ThreadRange(int lo, int hi) { threadlo = lo; threadhi = hi; return this; }
232ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson};
242ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson}  // namespace testing
252ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
262ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid SetBenchmarkBytesProcessed(long long);
272ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid StopBenchmarkTiming();
282ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid StartBenchmarkTiming();
292ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid BenchmarkMemoryUsage();
302ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonvoid SetBenchmarkItemsProcessed(int);
312ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
322ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodsonint NumCPUs();
332ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
342ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define BENCHMARK(f) \
352ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	::testing::Benchmark* _benchmark_##f = (new ::testing::Benchmark(#f, f))
362ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
372ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#define BENCHMARK_RANGE(f, lo, hi) \
382ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	::testing::Benchmark* _benchmark_##f = \
392ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson	(new ::testing::Benchmark(#f, f, lo, hi))
402ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson
412ee91b4af4353b9e6a9d591c32fedfc58fd4ef35Ian Hodson#endif  // RE2_UTIL_BENCHMARK_H__
42