/casa/OS/Timer.cc

https://github.com/casacore/casacore · C++ · 345 lines · 276 code · 33 blank · 36 comment · 72 complexity · 577b54124371615fddbf60ae11859cb7 MD5 · raw file

  1. //# Timer.cc: Timing facility
  2. //# Copyright (C) 1993,1994,1995,1996,1999,2001
  3. //# Associated Universities, Inc. Washington DC, USA.
  4. //#
  5. //# This library is free software; you can redistribute it and/or modify it
  6. //# under the terms of the GNU Library General Public License as published by
  7. //# the Free Software Foundation; either version 2 of the License, or (at your
  8. //# option) any later version.
  9. //#
  10. //# This library is distributed in the hope that it will be useful, but WITHOUT
  11. //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
  13. //# License for more details.
  14. //#
  15. //# You should have received a copy of the GNU Library General Public License
  16. //# along with this library; if not, write to the Free Software Foundation,
  17. //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
  18. //#
  19. //# Correspondence concerning AIPS++ should be addressed as follows:
  20. //# Internet email: aips2-request@nrao.edu.
  21. //# Postal address: AIPS++ Project Office
  22. //# National Radio Astronomy Observatory
  23. //# 520 Edgemont Road
  24. //# Charlottesville, VA 22903-2475 USA
  25. //#
  26. //# $Id$
  27. // User time:
  28. // time cpu spends in user mode on behalf of the program.
  29. // System time:
  30. // time cpu spends in system mode on behalf of the program.
  31. // Real time:
  32. // what you get from a stop watch timer.
  33. #include <casacore/casa/OS/Timer.h>
  34. #include <casacore/casa/BasicSL/String.h>
  35. #include <casacore/casa/iostream.h>
  36. #include <casacore/casa/iomanip.h>
  37. namespace casacore { //# NAMESPACE CASACORE - BEGIN
  38. void Timer::mark()
  39. {
  40. #if defined (DOS) || defined (MSDOS)
  41. usage0 = clock();
  42. ftime(&real0);
  43. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  44. # ifdef AIPS_CRAY_PGI
  45. struct timezone tz;
  46. getrusage(0, &usage0);
  47. timerclear(&real0);
  48. gettimeofday(&real0, &tz);
  49. # else
  50. real0 = times (&usage0);
  51. # endif
  52. #else
  53. getrusage(0, &usage0);
  54. ftime(&real0);
  55. #endif
  56. }
  57. double Timer::real() const
  58. {
  59. #if defined (DOS) || defined (MSDOS)
  60. double s, ms;
  61. timeb real1; // current elapsed real time
  62. int err;
  63. long ls;
  64. err = ftime(&real1);
  65. ls = real1.time - real0.time;
  66. s = ls;
  67. ls = real1.millitm - real0.millitm;
  68. ms = ls;
  69. ms = ms * 0.001 + s;
  70. return (ms);
  71. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  72. # ifdef AIPS_CRAY_PGI
  73. struct timeval now;
  74. struct timezone tz;
  75. timerclear(&now);
  76. gettimeofday(&now, &tz);
  77. return ((double) (now.tv_sec - real0.tv_sec));
  78. # else
  79. clock_t real1; // current time
  80. tms usage1; // current tms structure
  81. real1 = times (&usage1);
  82. return ((double) (real1 - real0)) / ((double) sysconf(_SC_CLK_TCK));
  83. # endif
  84. #else
  85. double s, ms;
  86. timeb real1; // current elapsed real time
  87. int err;
  88. long ls;
  89. err = ftime(&real1);
  90. ls = real1.time - real0.time;
  91. s = ls;
  92. ls = real1.millitm - real0.millitm;
  93. ms = ls;
  94. ms = ms * 0.001 + s;
  95. return (ms);
  96. #endif
  97. }
  98. double Timer::user() const
  99. {
  100. #if defined (DOS) || defined (MSDOS)
  101. register clock_t usage1;
  102. if ((usage1 = clock()) != (clock_t) -1) {
  103. return (usage1 - usage0);
  104. }
  105. // error: Processor time not available
  106. return (0.0);
  107. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  108. # ifdef AIPS_CRAY_PGI
  109. double dsec, dusec;
  110. rusage usage1; // current rusage structure
  111. getrusage(0, &usage1);
  112. dsec = (double)usage1.ru_utime.tv_sec - (double)usage0.ru_utime.tv_sec;
  113. dusec = (double)usage1.ru_utime.tv_usec - (double)usage0.ru_utime.tv_usec;
  114. return(dsec + dusec * 0.000001);
  115. # else
  116. tms usage1; // current tms structure
  117. times (&usage1);
  118. return ((double) (usage1.tms_utime - usage0.tms_utime))
  119. / ((double) sysconf(_SC_CLK_TCK));
  120. # endif
  121. #else
  122. double dsec, dusec;
  123. rusage usage1; // current rusage structure
  124. getrusage(0, &usage1);
  125. dsec = (double)usage1.ru_utime.tv_sec - (double)usage0.ru_utime.tv_sec;
  126. dusec = (double)usage1.ru_utime.tv_usec - (double)usage0.ru_utime.tv_usec;
  127. return(dsec + dusec * 0.000001);
  128. #endif
  129. }
  130. double Timer::system() const
  131. {
  132. #if defined (DOS) || defined (MSDOS)
  133. return(0L);
  134. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  135. # ifdef AIPS_CRAY_PGI
  136. double dsec, dusec;
  137. rusage usage1; // current rusage structure
  138. getrusage(0, &usage1);
  139. dsec = usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec;
  140. dusec = usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec;
  141. return(dsec + dusec*0.000001);
  142. # else
  143. tms usage1; // current tms structure
  144. times (&usage1);
  145. return ((double) (usage1.tms_stime - usage0.tms_stime))
  146. / ((double) sysconf(_SC_CLK_TCK));
  147. # endif
  148. #else
  149. register double dsec, dusec;
  150. rusage usage1; // current rusage structure
  151. getrusage(0, &usage1);
  152. dsec = usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec;
  153. dusec = usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec;
  154. return(dsec + dusec*0.000001);
  155. #endif
  156. }
  157. double Timer::all() const
  158. {
  159. #if defined (DOS) || defined (MSDOS)
  160. register clock_t usage1;
  161. if ((usage1 = clock()) != (clock_t) -1) {
  162. return (usage1 - usage0);
  163. }
  164. // error: Processor time not available
  165. return (0.0);
  166. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  167. # ifdef AIPS_CRAY_PGI
  168. double dsec, dusec;
  169. rusage usage1; // current rusage structure
  170. getrusage(0, &usage1);
  171. dsec = (usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec)
  172. + (usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec);
  173. dusec = (usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec)
  174. + (usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec);
  175. return(dsec + dusec*0.000001);
  176. # else
  177. tms usage1; // current tms structure
  178. times (&usage1);
  179. return ((double) ( (usage1.tms_utime - usage0.tms_utime)
  180. + (usage1.tms_stime - usage0.tms_stime) ))
  181. / ((double) sysconf(_SC_CLK_TCK));
  182. # endif
  183. #else
  184. register double dsec, dusec;
  185. rusage usage1; // current rusage structure
  186. getrusage(0, &usage1);
  187. dsec = (usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec)
  188. + (usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec);
  189. dusec = (usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec)
  190. + (usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec);
  191. return(dsec + dusec*0.000001);
  192. #endif
  193. }
  194. double Timer::user_usec() const
  195. {
  196. #if defined (DOS) || defined (MSDOS)
  197. register clock_t usage1;
  198. if ((usage1 = clock()) != (clock_t) -1) {
  199. return (usage1 - usage0);
  200. }
  201. // error: Processor time not available
  202. return (0.0);
  203. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  204. # ifdef AIPS_CRAY_PGI
  205. double dsec, dusec;
  206. rusage usage1; // current rusage structure
  207. getrusage(0, &usage1);
  208. dsec = usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec;
  209. dusec = usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec;
  210. return(dsec*1000000.0 + dusec);
  211. # else
  212. tms usage1; // current tms structure
  213. times (&usage1);
  214. return 1000000.0 *
  215. ((double) (usage1.tms_utime - usage0.tms_utime))
  216. / ((double) sysconf(_SC_CLK_TCK));
  217. # endif
  218. #else
  219. register double dsec, dusec;
  220. rusage usage1; // current rusage structure
  221. getrusage(0, &usage1);
  222. dsec = usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec;
  223. dusec = usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec;
  224. return(dsec*1000000.0 + dusec);
  225. #endif
  226. }
  227. double Timer::system_usec() const
  228. {
  229. #if defined (DOS) || defined (MSDOS)
  230. return(0.0);
  231. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  232. # ifdef AIPS_CRAY_PGI
  233. double dsec, dusec;
  234. rusage usage1; // current rusage structure
  235. getrusage(0, &usage1);
  236. dsec = usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec;
  237. dusec = usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec;
  238. return(dsec*1000000.0 + dusec);
  239. # else
  240. tms usage1; // current tms structure
  241. times (&usage1);
  242. return 1000000.0 *
  243. ((double) (usage1.tms_stime - usage0.tms_stime))
  244. / ((double) sysconf(_SC_CLK_TCK));
  245. # endif
  246. #else
  247. register double dsec, dusec;
  248. rusage usage1; // current rusage structure
  249. getrusage(0, &usage1);
  250. dsec = usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec;
  251. dusec = usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec;
  252. return(dsec*1000000.0 + dusec);
  253. #endif
  254. }
  255. double Timer::all_usec() const
  256. {
  257. #if defined (DOS) || defined (MSDOS)
  258. register clock_t usage1;
  259. if ((usage1 = clock()) != (clock_t) -1) {
  260. return (usage1 - usage0);
  261. }
  262. // error: Processor time not available
  263. return (0.0);
  264. #elif defined (AIPS_SOLARIS) || defined(AIPS_IRIX) || defined(AIPS_OSF) || defined(__hpux__) || defined(AIPS_LINUX) || defined(AIPS_DARWIN) || defined(AIPS_BSD) || defined(__GLIBC__)
  265. # ifdef AIPS_CRAY_PGI
  266. double dsec, dusec;
  267. rusage usage1; // current rusage structure
  268. getrusage(0, &usage1);
  269. dsec = (usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec)
  270. + (usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec);
  271. dusec = (usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec)
  272. + (usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec);
  273. return(dsec*1000000.0 + dusec);
  274. # else
  275. tms usage1; // current tms structure
  276. times (&usage1);
  277. return 1000000.0 *
  278. ((double) ( (usage1.tms_utime - usage0.tms_utime)
  279. + (usage1.tms_stime - usage0.tms_stime) ))
  280. / ((double) sysconf(_SC_CLK_TCK));
  281. # endif
  282. #else
  283. register double dsec, dusec;
  284. rusage usage1; // current rusage structure
  285. getrusage(0, &usage1);
  286. dsec = (usage1.ru_utime.tv_sec - usage0.ru_utime.tv_sec)
  287. + (usage1.ru_stime.tv_sec - usage0.ru_stime.tv_sec);
  288. dusec = (usage1.ru_utime.tv_usec - usage0.ru_utime.tv_usec)
  289. + (usage1.ru_stime.tv_usec - usage0.ru_stime.tv_usec);
  290. return(dsec*1000000.0 + dusec);
  291. #endif
  292. }
  293. void Timer::show() const
  294. {
  295. show(cout);
  296. }
  297. void Timer::show (const String& s) const
  298. {
  299. show(cout, s);
  300. }
  301. void Timer::show(ostream &os) const
  302. {
  303. os << setw(11) << real() << " real "
  304. << setw(11) << user() << " user "
  305. << setw(11) << system() << " system" << endl;
  306. }
  307. void Timer::show (ostream &os, const String& s) const
  308. {
  309. os << s;
  310. show(os);
  311. }
  312. } //# NAMESPACE CASACORE - END