foobar2000 SDK  2015-01-14
timers.h
Go to the documentation of this file.
1 #ifndef _PFC_PROFILER_H_
2 #define _PFC_PROFILER_H_
3 
4 #ifdef _WINDOWS
5 
6 #include <intrin.h>
7 namespace pfc {
9 public:
10  profiler_static(const char * p_name);
12  void add_time(t_int64 delta) {total_time+=delta;num_called++;}
13 private:
14  const char * name;
16 };
17 
19 public:
21  owner = p_owner;
22  start = __rdtsc();
23  }
25  t_int64 end = __rdtsc();
26  owner->add_time(end-start);
27  }
28 private:
31 };
32 
33 #define profiler(name) \
34  static pfc::profiler_static profiler_static_##name(#name); \
35  pfc::profiler_local profiler_local_##name(&profiler_static_##name);
36 
37 
38 class hires_timer {
39 public:
40  void start() {
41  m_start = g_query();
42  }
43  double query() const {
44  return _query( g_query() );
45  }
46  double query_reset() {
47  t_uint64 current = g_query();
48  double ret = _query(current);
49  m_start = current;
50  return ret;
51  }
52  pfc::string8 queryString(unsigned precision = 6) {
53  return pfc::format_time_ex( query(), precision ).get_ptr();
54  }
55 private:
56  double _query(t_uint64 p_val) const {
57  return (double)( p_val - m_start ) / (double) g_query_freq();
58  }
59  static t_uint64 g_query() {
60  LARGE_INTEGER val;
61  if (!QueryPerformanceCounter(&val)) throw pfc::exception_not_implemented();
62  return val.QuadPart;
63  }
65  LARGE_INTEGER val;
66  if (!QueryPerformanceFrequency(&val)) throw pfc::exception_not_implemented();
67  return val.QuadPart;
68  }
70 };
71 
72 class lores_timer {
73 public:
74  void start() {
75  _start(GetTickCount());
76  }
77 
78  double query() const {
79  return _query(GetTickCount());
80  }
81  double query_reset() {
82  t_uint32 time = GetTickCount();
83  double ret = _query(time);
84  _start(time);
85  return ret;
86  }
87  pfc::string8 queryString(unsigned precision = 3) {
88  return pfc::format_time_ex( query(), precision ).get_ptr();
89  }
90 private:
91  void _start(t_uint32 p_time) {m_last_seen = m_start = p_time;}
92  double _query(t_uint32 p_time) const {
93  t_uint64 time = p_time;
94  if (time < (m_last_seen & 0xFFFFFFFF)) time += 0x100000000;
95  m_last_seen = (m_last_seen & 0xFFFFFFFF00000000) + time;
96  return (double)(m_last_seen - m_start) / 1000.0;
97  }
100 };
101 }
102 #else
103 
104 namespace pfc {
105 
106 class hires_timer {
107 public:
108  void start();
109  double query() const;
110  double query_reset();
111  pfc::string8 queryString(unsigned precision = 3);
112 private:
113  double m_start;
114 };
115 
117 
118 }
119 
120 #endif
121 
122 #ifndef _WIN32
123 struct timespec;
124 #endif
125 
126 namespace pfc {
127  uint64_t fileTimeWtoU(uint64_t ft);
128  uint64_t fileTimeUtoW(uint64_t ft);
129 #ifndef _WIN32
130  uint64_t fileTimeUtoW( timespec const & ts );
131 #endif
132  uint64_t fileTimeNow();
133 }
134 
135 #endif
pfc::string8 queryString(unsigned precision=3)
Definition: timers.h:87
const char * name
Definition: timers.h:14
void _start(t_uint32 p_time)
Definition: timers.h:91
void start()
Definition: timers.h:74
uint64_t t_uint64
Definition: int_types.h:3
t_uint64 m_last_seen
Definition: timers.h:99
pfc::string8 queryString(unsigned precision=6)
Definition: timers.h:52
double query_reset()
Definition: timers.h:81
double m_start
Definition: timers.h:113
profiler_static * owner
Definition: timers.h:30
const char * get_ptr() const
Definition: string_base.h:491
double query() const
Definition: timers.h:43
double query_reset()
Definition: timers.h:46
uint64_t fileTimeUtoW(uint64_t ft)
Definition: timers.cpp:55
t_uint64 m_start
Definition: timers.h:98
double _query(t_uint64 p_val) const
Definition: timers.h:56
t_uint64 m_start
Definition: timers.h:69
hires_timer lores_timer
Definition: timers.h:116
t_uint64 total_time
Definition: timers.h:15
static t_uint64 g_query()
Definition: timers.h:59
uint64_t fileTimeNow()
Definition: timers.cpp:65
double query() const
Definition: timers.h:78
static t_uint64 g_query_freq()
Definition: timers.h:64
void start()
Definition: timers.h:40
double _query(t_uint32 p_time) const
Definition: timers.h:92
profiler_local(profiler_static *p_owner)
Definition: timers.h:20
t_uint64 num_called
Definition: timers.h:15
t_int64 start
Definition: timers.h:29
void add_time(t_int64 delta)
Definition: timers.h:12
uint64_t fileTimeWtoU(uint64_t ft)
Definition: timers.cpp:52
profiler_static(const char *p_name)
Definition: timers.cpp:7
uint32_t t_uint32
Definition: int_types.h:5
int64_t t_int64
Definition: int_types.h:2