e2c081f8c5ff3e3b975e7d8237ec5b531afbdab5
[scilab.git] / scilab / modules / core / includes / timer.hxx
1 /*
2  *  Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  *  Copyright (C) 2008-2008 - DIGITEO - Bruno JOFRET
4  *
5  *  This file must be used under the terms of the CeCILL.
6  *  This source file is licensed as described in the file COPYING, which
7  *  you should have received as part of this distribution.  The terms
8  *  are also available at
9  *  http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
10  *
11  */
12
13 #ifndef __TIMER_HXX__
14 #define __TIMER_HXX__
15
16 #ifndef _MSC_VER
17 #include <sys/time.h>
18 #else
19 #define NOMINMAX
20 #include <windows.h>
21 #undef NOMINMAX
22 #endif
23 #include <iostream>
24 #include <iomanip>
25
26 class Timer
27 {
28
29 private:
30 #ifndef _MSC_VER
31     int start_hour;
32     int start_min;
33     int start_sec;
34     int start_usec;
35 #else
36     LARGE_INTEGER iStart;
37     LARGE_INTEGER iEnd;
38     LARGE_INTEGER iFreq;
39 #endif
40
41 public:
42
43     //===========================================================================
44     // Return the total time that the timer has been in the "running"
45     // state since it was first "started" or last "restarted".  For
46     // "short" time periods (less than an hour), the actual cpu time
47     // used is reported instead of the elapsed time.
48
49     inline double elapsed_time(bool _bRestart = false)
50     {
51         // FIXME : Tonio
52 #ifndef _MSC_VER
53         struct timeval tv;
54         struct timezone tz;
55         struct tm *tm;
56         gettimeofday(&tv, &tz);
57         tm = localtime(&tv.tv_sec);
58         double dblTime = ( 3600000.0 * (tm->tm_hour - start_hour) +
59                            60000.0 * (tm->tm_min - start_min) +
60                            1000.0 * (tm->tm_sec - start_sec) +
61                            (1.0 * (tv.tv_usec - start_usec)) / 1000.0
62                          );
63 #else
64         QueryPerformanceCounter(&iEnd);
65         double dblTime  = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
66 #endif
67
68         if (_bRestart == true)
69         {
70             start();
71         }
72         return dblTime;
73     } // timer::elapsed_time
74 public:
75     Timer()
76     {
77 #ifndef _MSC_VER
78         start_hour      = 0;
79         start_min               = 0;
80         start_sec               = 0;
81         start_usec      = 0;
82 #else
83         iStart.QuadPart = 0;
84         iEnd.QuadPart           = 0;
85         QueryPerformanceFrequency(&iFreq);
86 #endif
87     }
88
89     //===========================================================================
90     // Start a timer.  If it is already running, let it continue running.
91     // Print an optional message.
92
93     inline void start(const std::wstring _msg = std::wstring(L""))
94     {
95         // Print an optional message, something like "Starting timer t";
96         if (_msg.empty() == false)
97         {
98             std::wcerr << _msg << std::endl;
99         }
100 #ifndef _MSC_VER
101         // FIXME : Tonio
102
103         // Set the start time
104         struct timeval tv;
105         struct timezone tz;
106         struct tm *tm;
107         gettimeofday(&tv, &tz);
108         tm = localtime(&tv.tv_sec);
109         start_hour = tm->tm_hour;
110         start_min = tm->tm_min;
111         start_sec = tm->tm_sec;
112         start_usec = tv.tv_usec;
113 #else
114         QueryPerformanceCounter(&iStart);
115 #endif
116     } // timer::start
117
118     //===========================================================================
119     // Stop the timer and print an optional message.
120
121     //===========================================================================
122     // Print out an optional message followed by the current timer timing.
123
124     inline double check(const std::wstring _msg, bool _bRestart = false)
125     {
126         // Print an optional message, something like "Checking timer t";
127         double t = elapsed_time();
128         if (_msg.empty() == false)
129         {
130             std::wcerr << L"[" << _msg << L"]" << L" : ";
131         }
132         std::wcerr << L"Elapsed time ["
133                    << std::setiosflags(std::ios::fixed)
134                    << std::setprecision(3)
135                    << t << L"] milliseconds"
136                    << std::endl;
137
138         if (_bRestart == true)
139         {
140             start();
141         }
142         return t;
143     } // timer::check
144
145 };
146
147 //===========================================================================
148 // Allow timers to be printed to ostreams using the syntax 'os << t'
149 // for an ostream 'os' and a timer 't'.  For example, "cout << t" will
150 // print out the total amount of time 't' has been "running".
151
152 inline std::wostream& operator<<(std::wostream& os, Timer& t)
153 {
154     os << std::setprecision(3)
155        << std::setiosflags(std::ios::fixed)
156        << t.elapsed_time() ;
157     return os;
158 }
159
160 //===========================================================================
161 #endif /* !__TIMER_HXX__ */