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