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 #ifdef _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 #else
91 
92 #include <sys/time.h>
93 #include <sys/resource.h>
94 #include <unistd.h>
95 #include <sys/times.h>
96 
97 class Portable_Timer
98 {
99  public:
100 
Portable_Timer()101   Portable_Timer()
102   {
103     m_clkid = BtlConfig::Instance.realclock ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID;
104   }
105 
Portable_Timer(int clkid)106   Portable_Timer(int clkid) : m_clkid(clkid)
107   {}
108 
start()109   void start()
110   {
111     timespec ts;
112     clock_gettime(m_clkid, &ts);
113     m_start_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);
114 
115   }
116 
stop()117   void stop()
118   {
119     timespec ts;
120     clock_gettime(m_clkid, &ts);
121     m_stop_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec);
122 
123   }
124 
elapsed()125   double elapsed()
126   {
127     return  user_time();
128   }
129 
user_time()130   double user_time()
131   {
132     return m_stop_time - m_start_time;
133   }
134 
135 
136 private:
137 
138   int m_clkid;
139   double m_stop_time, m_start_time;
140 
141 }; // Portable_Timer
142 
143 #endif
144 
145 #endif  // PORTABLE_TIMER_HPP
146