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