00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #include<Timer.h>
00038 #include <bool.h>
00039
00040 #ifdef NOW
00041 extern "C" int getrusage(int who, struct rusage *rusage);
00042 #endif
00043
00044 #ifndef CLK_TCK
00045 #define CLK_TCK sysconf(_SC_CLK_TCK)
00046 #endif
00047
00048 Timer::Timer()
00049 {
00050 #ifdef _WIN32
00051
00052 #else
00053 r1us = &r1usage;
00054 r2us = &r2usage;
00055 #endif
00056 }
00057
00058 Timer::~Timer()
00059 {
00060
00061 }
00062
00063 void
00064 Timer::start(void)
00065 {
00066 #ifdef _WIN32
00067
00068 #else
00069 t1 = times(&tmsstart);
00070 getrusage(0,r1us);
00071 #endif
00072 }
00073
00074 void
00075 Timer::pause(void)
00076 {
00077 #ifdef _WIN32
00078
00079 #else
00080 t2 = times(&tmsend);
00081 getrusage(0,r2us);
00082 #endif
00083 }
00084
00085
00086 double
00087 Timer::getReal(void) const
00088 {
00089 #ifdef _WIN32
00090
00091 return 0.0;
00092 #else
00093 long clktck = CLK_TCK;
00094 double Real = (t2-t1)/(double) clktck;
00095 return Real;
00096 #endif
00097 }
00098
00099 double
00100 Timer::getCPU(void) const
00101 {
00102 #ifdef _WIN32
00103
00104 return 0.0;
00105 #else
00106 long clktck = CLK_TCK;
00107 double CPU = (tmsend.tms_utime - tmsstart.tms_utime)/(double) clktck;
00108 return CPU;
00109 #endif
00110 }
00111
00112 int
00113 Timer::getNumPageFaults(void) const
00114 {
00115 #ifdef _WIN32
00116
00117 return 0;
00118 #else
00119 int r2yes = r2us->ru_majflt;
00120 int r1yes = r1us->ru_majflt;
00121 return r2yes-r1yes;
00122 #endif
00123 }
00124
00125
00126
00127 void
00128 Timer::Print(OPS_Stream &s) const
00129 {
00130 #ifdef _WIN32
00131
00132 #else
00133 long clktck = CLK_TCK;
00134 double Real = (t2-t1)/(double) clktck;
00135 double CPU = (tmsend.tms_utime - tmsstart.tms_utime)/(double) clktck;
00136 double System = (tmsend.tms_stime - tmsstart.tms_stime)/(double) clktck;
00137 s << endln;
00138 s << "TIME(sec) Real: " << Real << " CPU: " << CPU;
00139 s << " System: " << System << endln;
00140
00141 int r2no = r2us->ru_minflt;
00142 int r2yes = r2us->ru_majflt;
00143 int r1no = r1us->ru_minflt;
00144 int r1yes = r1us->ru_majflt;
00145 int r1page = r1no + r1yes;
00146 int r2page = r2no + r2yes;
00147
00148 s << "PAGE FAULTS: " << r2page-r1page << " (NO i/o: ";
00149 s << r2no-r1no << " YES i/o " << r2yes-r1yes << ") ";
00150
00151 r2no = r2us->ru_nivcsw;
00152 r2yes = r2us->ru_nvcsw;
00153 r1no = r1us->ru_nivcsw;
00154 r1yes = r1us->ru_nvcsw;
00155 r1page = r1no + r1yes;
00156 r2page = r2no + r2yes;
00157
00158 s << "CONTEXT SWITCHES " << r2page-r1page << " (Invol: ";
00159 s << r2no-r1no << " Voluntary " << r2yes-r1yes << ") ";
00160
00161 r2no = r2us->ru_nswap;
00162 r1no = r1us->ru_nswap;
00163 r2yes = r2us->ru_maxrss;
00164
00165 s << "Swapped: " << r2no-r1no << " Max Res Set Size: " << r2yes << endln;
00166 s << endln;
00167 #endif
00168 }
00169
00170 OPS_Stream &operator<<(OPS_Stream &s, const Timer &E)
00171 {
00172 E.Print(s);
00173 return s;
00174 }
00175
00176