Timer.h revision 81a96aa6242f7b559770f5dc62316253cb8cb0d4
1//===-- Timer.h -------------------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_Timer_h_ 11#define liblldb_Timer_h_ 12#if defined(__cplusplus) 13 14#include <stdarg.h> 15#include <stdio.h> 16#include <string> 17#include "lldb/lldb-private.h" 18#include "lldb/Host/TimeValue.h" 19 20namespace lldb_private { 21 22//---------------------------------------------------------------------- 23/// @class Timer Timer.h "lldb/Core/Timer.h" 24/// @brief A timer class that simplifies common timing metrics. 25/// 26/// A scoped timer class that allows a variety of pthread mutex 27/// objects to have a mutex locked when a Timer::Locker 28/// object is created, and unlocked when it goes out of scope or 29/// when the Timer::Locker::Reset(pthread_mutex_t *) 30/// is called. This provides an exception safe way to lock a mutex 31/// in a scope. 32//---------------------------------------------------------------------- 33 34class Timer 35{ 36public: 37 static void 38 Initialize (); 39 40 //-------------------------------------------------------------- 41 /// Default constructor. 42 //-------------------------------------------------------------- 43 Timer(const char *category, const char *format, ...) __attribute__ ((format (printf, 3, 4))); 44 45 //-------------------------------------------------------------- 46 /// Desstructor 47 //-------------------------------------------------------------- 48 ~Timer(); 49 50 void 51 Dump (); 52 53 static void 54 SetDisplayDepth (uint32_t depth); 55 56 static void 57 SetQuiet (bool value); 58 59 static void 60 DumpCategoryTimes (Stream *s); 61 62 static void 63 ResetCategoryTimes (); 64 65protected: 66 67 void 68 ChildStarted (const TimeValue& time); 69 70 void 71 ChildStopped (const TimeValue& time); 72 73 uint64_t 74 GetTotalElapsedNanoSeconds(); 75 76 uint64_t 77 GetTimerElapsedNanoSeconds(); 78 79 //-------------------------------------------------------------- 80 /// Member variables 81 //-------------------------------------------------------------- 82 const char *m_category; 83 TimeValue m_total_start; 84 TimeValue m_timer_start; 85 uint64_t m_total_ticks; // Total running time for this timer including when other timers below this are running 86 uint64_t m_timer_ticks; // Ticks for this timer that do not include when other timers below this one are running 87 static uint32_t g_depth; 88 static uint32_t g_display_depth; 89 static FILE * g_file; 90private: 91 Timer(); 92 DISALLOW_COPY_AND_ASSIGN (Timer); 93}; 94 95class IntervalTimer 96{ 97public: 98 IntervalTimer() : 99 m_start (TimeValue::Now()) 100 { 101 } 102 103 ~IntervalTimer() 104 { 105 } 106 107 uint64_t 108 GetElapsedNanoSeconds() const 109 { 110 return TimeValue::Now() - m_start; 111 } 112 113 void 114 Reset () 115 { 116 m_start = TimeValue::Now(); 117 } 118 119 int 120 PrintfElapsed (const char *format, ...) __attribute__ ((format (printf, 2, 3))) 121 { 122 TimeValue now (TimeValue::Now()); 123 const uint64_t elapsed_nsec = now - m_start; 124 const char *unit = NULL; 125 float elapsed_value; 126 if (elapsed_nsec < 1000) 127 { 128 unit = "ns"; 129 elapsed_value = (float)elapsed_nsec; 130 } 131 else if (elapsed_nsec < 1000000) 132 { 133 unit = "us"; 134 elapsed_value = (float)elapsed_nsec/1000.0f; 135 } 136 else if (elapsed_nsec < 1000000000) 137 { 138 unit = "ms"; 139 elapsed_value = (float)elapsed_nsec/1000000.0f; 140 } 141 else 142 { 143 unit = "sec"; 144 elapsed_value = (float)elapsed_nsec/1000000000.0f; 145 } 146 int result = printf ("%3.2f %s: ", elapsed_value, unit); 147 va_list args; 148 va_start (args, format); 149 result += vprintf (format, args); 150 va_end (args); 151 return result; 152 } 153protected: 154 TimeValue m_start; 155}; 156 157} // namespace lldb_private 158 159#endif // #if defined(__cplusplus) 160#endif // #ifndef liblldb_Timer_h_ 161