add runvisitor hierarchy
[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 void check(const char* msg, bool _bRestart = false)
121   {
122     // Print an optional message, something like "Checking timer t";
123     if (msg) std::cerr << "[" << msg << "]" << " : ";
124     std::cerr << "Elapsed time ["
125               << std::setiosflags(std::ios::fixed)
126               << std::setprecision(3)
127               << elapsed_time() << "] milliseconds"
128               << std::endl;
129
130                 if(_bRestart == true)
131                 {
132                         start();
133                 }
134   } // timer::check
135
136 };
137
138   //===========================================================================
139   // Allow timers to be printed to ostreams using the syntax 'os << t'
140   // for an ostream 'os' and a timer 't'.  For example, "cout << t" will
141   // print out the total amount of time 't' has been "running".
142
143   inline std::ostream& operator<<(std::ostream& os, Timer& t)
144   {
145     os << std::setprecision(3)
146        << std::setiosflags(std::ios::fixed)
147        << t.elapsed_time() ;
148     return os;
149   }
150
151   //===========================================================================
152 #endif /* !__TIMER_HXX__ */