Timer : get the date before do something.
[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 #include <windows.h>
20 //#include <winbase.h>
21 #endif
22 #include <iostream>
23 #include <iomanip>
24
25 class Timer
26 {
27
28 private:
29 #ifndef _MSC_VER
30     int start_hour;
31     int start_min;
32     int start_sec;
33     int start_usec;
34 #else
35     LARGE_INTEGER iStart;
36     LARGE_INTEGER iEnd;
37     LARGE_INTEGER iFreq;
38 #endif
39
40 public:
41
42     //===========================================================================
43     // Return the total time that the timer has been in the "running"
44     // state since it was first "started" or last "restarted".  For
45     // "short" time periods (less than an hour), the actual cpu time
46     // used is reported instead of the elapsed time.
47
48     inline double elapsed_time(bool _bRestart = false)
49     {
50         // FIXME : Tonio
51 #ifndef _MSC_VER
52         struct timeval tv;
53         struct timezone tz;
54         struct tm *tm;
55         gettimeofday(&tv, &tz);
56         tm = localtime(&tv.tv_sec);
57         double dblTime = ( 3600000.0 * (tm->tm_hour - start_hour) +
58                            60000.0 * (tm->tm_min - start_min) +
59                            1000.0 * (tm->tm_sec - start_sec) +
60                            (1.0 * (tv.tv_usec - start_usec)) / 1000.0
61                          );
62 #else
63         QueryPerformanceCounter(&iEnd);
64         double dblTime  = ((iEnd.QuadPart - iStart.QuadPart) * 1000.0) / iFreq.QuadPart;
65 #endif
66
67         if (_bRestart == true)
68         {
69             start();
70         }
71         return dblTime;
72     } // timer::elapsed_time
73 public:
74     Timer()
75     {
76 #ifndef _MSC_VER
77         start_hour      = 0;
78         start_min               = 0;
79         start_sec               = 0;
80         start_usec      = 0;
81 #else
82         iStart.QuadPart = 0;
83         iEnd.QuadPart           = 0;
84         QueryPerformanceFrequency(&iFreq);
85 #endif
86     }
87
88     //===========================================================================
89     // Start a timer.  If it is already running, let it continue running.
90     // Print an optional message.
91
92     inline void start(const char* msg = 0)
93     {
94         // Print an optional message, something like "Starting timer t";
95         if (msg) std::cerr << msg << std::endl;
96 #ifndef _MSC_VER
97         // FIXME : Tonio
98
99         // Set the start time
100         struct timeval tv;
101         struct timezone tz;
102         struct tm *tm;
103         gettimeofday(&tv, &tz);
104         tm = localtime(&tv.tv_sec);
105         start_hour = tm->tm_hour;
106         start_min = tm->tm_min;
107         start_sec = tm->tm_sec;
108         start_usec = tv.tv_usec;
109 #else
110         QueryPerformanceCounter(&iStart);
111 #endif
112     } // timer::start
113
114     //===========================================================================
115     // Stop the timer and print an optional message.
116
117     //===========================================================================
118     // Print out an optional message followed by the current timer timing.
119
120     inline double check(const char* msg, bool _bRestart = false)
121     {
122         // Print an optional message, something like "Checking timer t";
123         double t = elapsed_time();
124         if (msg) std::cerr << "[" << msg << "]" << " : ";
125         std::cerr << "Elapsed time ["
126                   << std::setiosflags(std::ios::fixed)
127                   << std::setprecision(3)
128                   << t << "] milliseconds"
129                   << std::endl;
130
131         if (_bRestart == true)
132         {
133             start();
134         }
135         return t;
136     } // timer::check
137
138 };
139
140 //===========================================================================
141 // Allow timers to be printed to ostreams using the syntax 'os << t'
142 // for an ostream 'os' and a timer 't'.  For example, "cout << t" will
143 // print out the total amount of time 't' has been "running".
144
145 inline std::ostream& operator<<(std::ostream& os, Timer& t)
146 {
147     os << std::setprecision(3)
148        << std::setiosflags(std::ios::fixed)
149        << t.elapsed_time() ;
150     return os;
151 }
152
153 //===========================================================================
154 #endif /* !__TIMER_HXX__ */