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