• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //=====================================================
2 // File   :  portable_timer.hh
3 // Author :  L. Plagne <laurent.plagne@edf.fr)> from boost lib
4 // Copyright (C) EDF R&D,  lun sep 30 14:23:17 CEST 2002
5 //=====================================================
6 //
7 // This program is free software; you can redistribute it and/or
8 // modify it under the terms of the GNU General Public License
9 // as published by the Free Software Foundation; either version 2
10 // of the License, or (at your option) any later version.
11 //
12 // This program is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 // GNU General Public License for more details.
16 // You should have received a copy of the GNU General Public License
17 // along with this program; if not, write to the Free Software
18 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19 //
20 //  simple_time extracted from the boost library
21 //
22 #ifndef _PORTABLE_TIMER_HH
23 #define _PORTABLE_TIMER_HH
24 
25 #include <ctime>
26 #include <cstdlib>
27 
28 #include <time.h>
29 
30 
31 #define USEC_IN_SEC 1000000
32 
33 
34 //  timer  -------------------------------------------------------------------//
35 
36 //  A timer object measures CPU time.
37 #if defined(_MSC_VER)
38 
39 #define NOMINMAX
40 #include <windows.h>
41 
42 /*#ifndef hr_timer
43 #include "hr_time.h"
44 #define hr_timer
45 #endif*/
46 
47  class Portable_Timer
48  {
49   public:
50 
51    typedef struct {
52     LARGE_INTEGER start;
53     LARGE_INTEGER stop;
54    } stopWatch;
55 
56 
Portable_Timer()57    Portable_Timer()
58    {
59 	 startVal.QuadPart = 0;
60 	 stopVal.QuadPart = 0;
61 	 QueryPerformanceFrequency(&frequency);
62    }
63 
start()64    void start() { QueryPerformanceCounter(&startVal); }
65 
stop()66    void stop() { QueryPerformanceCounter(&stopVal); }
67 
elapsed()68    double elapsed() {
69 	 LARGE_INTEGER time;
70      time.QuadPart = stopVal.QuadPart - startVal.QuadPart;
71      return LIToSecs(time);
72    }
73 
user_time()74    double user_time() { return elapsed(); }
75 
76 
77  private:
78 
LIToSecs(LARGE_INTEGER & L)79    double LIToSecs(LARGE_INTEGER& L) {
80      return ((double)L.QuadPart /(double)frequency.QuadPart) ;
81    }
82 
83    LARGE_INTEGER startVal;
84    LARGE_INTEGER stopVal;
85    LARGE_INTEGER frequency;
86 
87 
88  }; // Portable_Timer
89 
90 #elif defined(__APPLE__)
91 #include <CoreServices/CoreServices.h>
92 #include <mach/mach_time.h>
93 
94 
95 class Portable_Timer
96 {
97  public:
98 
Portable_Timer()99   Portable_Timer()
100   {
101   }
102 
start()103   void start()
104   {
105     m_start_time = double(mach_absolute_time())*1e-9;;
106 
107   }
108 
stop()109   void stop()
110   {
111     m_stop_time = double(mach_absolute_time())*1e-9;;
112 
113   }
114 
elapsed()115   double elapsed()
116   {
117     return  user_time();
118   }
119 
user_time()120   double user_time()
121   {
122     return m_stop_time - m_start_time;
123   }
124 
125 
126 private:
127 
128   double m_stop_time, m_start_time;
129 
130 }; // Portable_Timer (Apple)
131 
132 #else
133 
134 #include <sys/time.h>
135 #include <sys/resource.h>
136 #include <unistd.h>
137 #include <sys/times.h>
138 
139 class Portable_Timer
140 {
141  public:
142 
Portable_Timer()143   Portable_Timer()
144   {
145     m_clkid = BtlConfig::Instance.realclock ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID;
146   }
147 
Portable_Timer(int clkid)148   Portable_Timer(int clkid) : m_clkid(clkid)
149   {}
150 
start()151   void start()
152   {
153     timespec ts;
154     clock_gettime(m_clkid, &ts);
155     m_start_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);
156 
157   }
158 
stop()159   void stop()
160   {
161     timespec ts;
162     clock_gettime(m_clkid, &ts);
163     m_stop_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);
164 
165   }
166 
elapsed()167   double elapsed()
168   {
169     return  user_time();
170   }
171 
user_time()172   double user_time()
173   {
174     return m_stop_time - m_start_time;
175   }
176 
177 
178 private:
179 
180   int m_clkid;
181   double m_stop_time, m_start_time;
182 
183 }; // Portable_Timer (Linux)
184 
185 #endif
186 
187 #endif  // PORTABLE_TIMER_HPP
188