• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
14 class 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 // ----------------------------------------------------------------------
21 bool InitPerfLog(const FilePath& log_path);
22 void 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 // ----------------------------------------------------------------------
29 void LogPerfResult(const char* test_name, double value, const char* units);
30 
31 // ----------------------------------------------------------------------
32 // PerfTimer
33 //   A simple wrapper around Now()
34 // ----------------------------------------------------------------------
35 class PerfTimer {
36  public:
PerfTimer()37   PerfTimer() {
38     begin_ = base::TimeTicks::Now();
39   }
40 
41   // Returns the time elapsed since object construction
Elapsed()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 // ----------------------------------------------------------------------
58 class PerfTimeLogger {
59  public:
PerfTimeLogger(const char * test_name)60   explicit PerfTimeLogger(const char* test_name)
61       : logged_(false),
62         test_name_(test_name) {
63   }
64 
~PerfTimeLogger()65   ~PerfTimeLogger() {
66     if (!logged_)
67       Done();
68   }
69 
Done()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