| Index: src/platform/microbenchmark/microbenchmark.h
|
| diff --git a/src/platform/microbenchmark/microbenchmark.h b/src/platform/microbenchmark/microbenchmark.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ec4bf661927a7d516c3396aed956b4d5545eb08c
|
| --- /dev/null
|
| +++ b/src/platform/microbenchmark/microbenchmark.h
|
| @@ -0,0 +1,101 @@
|
| +// Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +// Some portions Copyright (c) 2009 The Chromium Authors.
|
| +//
|
| +// Simple microbenchmark framework
|
| +
|
| +#ifndef __CHROMEOS_MICROBENCHMARK_MICROBENCHMARK_H
|
| +#define __CHROMEOS_MICROBENCHMARK_MICROBENCHMARK_H
|
| +
|
| +#include <errno.h>
|
| +#include <time.h>
|
| +
|
| +#include <iostream>
|
| +
|
| +#include <base/basictypes.h>
|
| +#include <base/command_line.h>
|
| +#include <base/logging.h>
|
| +#include <base/scoped_ptr.h>
|
| +#include <gtest/gtest.h>
|
| +
|
| +#define CHROMEOS_MICROBENCHMARK_WITH_SETUP(_SETUP_NAME, _NAME, _RUNS) \
|
| +class _NAME ## Class : public Microbenchmark { \
|
| + public: \
|
| + _NAME ## Class() {} \
|
| + ~_NAME ## Class() {} \
|
| + const char *name() const { return #_NAME; } \
|
| + void Setup(uint64 runs) { _SETUP_NAME(runs); } \
|
| + void SingleTest(bool scaffold_only) { _NAME(scaffold_only); } \
|
| +}; \
|
| +TEST(_NAME, Microbenchmark) { \
|
| + _NAME ## Class chromeos_benchmark; \
|
| + CommandLine *cl = CommandLine::ForCurrentProcess(); \
|
| + errno = 0; \
|
| + std::string runs_str = \
|
| + cl->GetSwitchValueASCII(chromeos::Microbenchmark::kRunsSwitch); \
|
| + unsigned long long runs = _RUNS; \
|
| + if (!runs_str.empty()) { \
|
| + errno = 0; \
|
| + runs = strtoull(runs_str.c_str(), NULL, 0); \
|
| + if (errno) \
|
| + runs = _RUNS; \
|
| + } \
|
| + chromeos_benchmark.Run(runs); \
|
| + chromeos_benchmark.Print(); \
|
| +}
|
| +
|
| +#define CHROMEOS_MICROBENCHMARK(_NAME, _RUNS) \
|
| + CHROMEOS_MICROBENCHMARK_WITH_SETUP(chromeos::microbenchmark_helper::NoSetup, \
|
| + _NAME, \
|
| + _RUNS)
|
| +namespace chromeos {
|
| +
|
| +namespace microbenchmark_helper {
|
| +void NoSetup(uint64 runs);
|
| +} // microbenchmark
|
| +
|
| +// A simple microbenchmarking abstract class.
|
| +// This class is not thread-safe and should only be invoked
|
| +// from one thread at a time.
|
| +class Microbenchmark {
|
| + public:
|
| + Microbenchmark() : scaffold_total_ns_(0),
|
| + scaffold_per_run_ns_(0),
|
| + total_ns_(0),
|
| + per_run_ns_(0),
|
| + runs_(0) {}
|
| + virtual ~Microbenchmark() {}
|
| + // Switch to override the number of runs to perform.
|
| + static const char *kRunsSwitch;
|
| + // Performs the actual microbenchmarking.
|
| + void Run(uint64 number_of_runs);
|
| + // Outputs a standard format of the testing data to stdout.
|
| + void Print() const;
|
| + // Accessors
|
| + const uint64 total_nanoseconds() const { return total_ns_; }
|
| + const uint64 per_run_nanoseconds() const { return per_run_ns_; }
|
| + const uint64 scaffold_total_nanoseconds() const
|
| + { return scaffold_total_ns_; }
|
| + const uint64 scaffold_per_run_nanoseconds() const
|
| + { return scaffold_per_run_ns_; }
|
| + const uint64 runs() const { return runs_; }
|
| +
|
| + //// Test code to be implemented by the class consumer.
|
| + virtual const char *name() const = 0;
|
| + // Called automatically before the benchmark.
|
| + virtual void Setup(uint64 runs) = 0;
|
| + // Should execute the test to benchmark once.
|
| + virtual void SingleTest(bool scaffold_only) = 0;
|
| +
|
| + private:
|
| + uint64 scaffold_total_ns_;
|
| + uint64 scaffold_per_run_ns_;
|
| + uint64 total_ns_;
|
| + uint64 per_run_ns_;
|
| + uint64 runs_;
|
| + DISALLOW_COPY_AND_ASSIGN(Microbenchmark);
|
| +};
|
| +
|
| +} // chromeos
|
| +#endif // __CHROMEOS_MICROBENCHMARK_MICROBENCHMARK_H
|
|
|