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