1// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef BASE_PERFTIMER_H_
6#define BASE_PERFTIMER_H_
7#pragma once
8
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/time.h"
13
14class FilePath;
15
16// ----------------------------------------------------------------------
17// Initializes and finalizes the perf log. These functions should be
18// called at the beginning and end (respectively) of running all the
19// performance tests. The init function returns true on success.
20// ----------------------------------------------------------------------
21bool InitPerfLog(const FilePath& log_path);
22void FinalizePerfLog();
23
24// ----------------------------------------------------------------------
25// LogPerfResult
26//   Writes to the perf result log the given 'value' resulting from the
27//   named 'test'. The units are to aid in reading the log by people.
28// ----------------------------------------------------------------------
29void LogPerfResult(const char* test_name, double value, const char* units);
30
31// ----------------------------------------------------------------------
32// PerfTimer
33//   A simple wrapper around Now()
34// ----------------------------------------------------------------------
35class PerfTimer {
36 public:
37  PerfTimer() {
38    begin_ = base::TimeTicks::Now();
39  }
40
41  // Returns the time elapsed since object construction
42  base::TimeDelta Elapsed() const {
43    return base::TimeTicks::Now() - begin_;
44  }
45
46 private:
47  base::TimeTicks begin_;
48};
49
50// ----------------------------------------------------------------------
51// PerfTimeLogger
52//   Automates calling LogPerfResult for the common case where you want
53//   to measure the time that something took. Call Done() when the test
54//   is complete if you do extra work after the test or there are stack
55//   objects with potentially expensive constructors. Otherwise, this
56//   class with automatically log on destruction.
57// ----------------------------------------------------------------------
58class PerfTimeLogger {
59 public:
60  explicit PerfTimeLogger(const char* test_name)
61      : logged_(false),
62        test_name_(test_name) {
63  }
64
65  ~PerfTimeLogger() {
66    if (!logged_)
67      Done();
68  }
69
70  void Done() {
71    // we use a floating-point millisecond value because it is more
72    // intuitive than microseconds and we want more precision than
73    // integer milliseconds
74    LogPerfResult(test_name_.c_str(), timer_.Elapsed().InMillisecondsF(), "ms");
75    logged_ = true;
76  }
77
78 private:
79  bool logged_;
80  std::string test_name_;
81  PerfTimer timer_;
82};
83
84#endif  // BASE_PERFTIMER_H_
85