Timer.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:3k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////
  2. // Timer.h
  3. // Kari Pulli
  4. // 
  5. ////////////////////////////////////////////////////////////
  6. #ifndef _TIMER_H_
  7. #define _TIMER_H_
  8. #include <iostream.h>
  9. #ifdef WIN32
  10. #define WIN32_LEAN_AND_MEAN
  11. #  include <windows.h>
  12. #else
  13. #  include <sys/time.h> // for gettimeofday()
  14. #  include <sys/times.h> // for times()
  15. #endif
  16. #include <time.h> // for gettimeofday()
  17. #include <assert.h>
  18. const int NTICKS=100;
  19. #define REALTIME
  20. class Timer {
  21. private:
  22.   const char* iname;
  23.   int started;
  24.   int tmspu, tmsps; // process{user,system}
  25.   double ireal;
  26. public:
  27.   Timer(const char* pname=0) : iname(pname) { zero(); }
  28.   void setname(const char* pname) { iname = pname; }
  29.   void zero()                 { started =tmspu =tmsps =ireal = 0; }
  30.   const char* name() const    { return iname; }
  31.   float real() const          { return ireal; }
  32.   float user() const          { return float(tmspu+tmsps)/NTICKS; }
  33.   
  34.   void start()
  35.     {
  36.       started = 1;
  37.       //assert(!started++);
  38. #ifdef WIN32
  39.       tmspu -= GetTickCount();
  40. #else
  41.       struct tms tm;
  42.       (void)times(&tm);
  43.       tmspu-=(int)tm.tms_utime; tmsps-=(int)tm.tms_stime;
  44. #     ifdef REALTIME
  45.       struct timeval ti; struct timezone tz;
  46.       gettimeofday(&ti,&tz);
  47.       ireal-=double(ti.tv_sec)+ti.tv_usec/1e6;
  48. #     endif
  49. #endif
  50.     }
  51.   void stop()
  52.     {
  53.       if (started) {
  54. started = 0;
  55. //assert(!--started);
  56. #ifdef WIN32
  57. tmspu += GetTickCount();
  58. #else
  59. struct tms tm;
  60. (void)times(&tm);
  61. tmspu+=(int)tm.tms_utime; tmsps+=(int)tm.tms_stime;
  62. #       ifdef REALTIME
  63. struct timeval ti; struct timezone tz;
  64. gettimeofday(&ti,&tz);
  65. ireal+=double(ti.tv_sec)+ti.tv_usec/1e6;
  66. #       endif
  67. #endif
  68.       }
  69.     }
  70.   ~Timer()                    { stop(); cerr << *this; }
  71.   friend inline ostream& operator<<(ostream& s, const Timer& t);
  72.   static unsigned int get_system_tick_count() // in milliseconds
  73.     {
  74. #ifdef WIN32
  75.       return GetTickCount();
  76. #else
  77. #     ifdef REALTIME
  78.       struct timeval ti; struct timezone tz;
  79.       gettimeofday(&ti,&tz);
  80.       return ti.tv_sec * 1000 + ti.tv_usec / 1000;
  81. #     else
  82.       struct tms tm;
  83.       (void)times(&tm);
  84.       return (int)tm.tms_utime + (int)tm.tms_stime;
  85. #     endif
  86. #endif      
  87.     }
  88. };
  89. #define TIMERN(id) Timer_##id
  90. #define TIMERC(id) Timer TIMERN(id)(#id)
  91. #define TIMER(id)  TIMERC(id); TIMERN(id).start()
  92. #define TIMER_START(id)  TIMERN(id).start()
  93. #define TIMER_STOP(id)   TIMERN(id).stop()
  94. inline
  95. ostream& operator<<(ostream& s, const Timer& t)
  96. {
  97.   s << "Timer " << (t.iname ? t.iname : "?") << ": ";
  98.   if (t.started) return s << "runningn";
  99.   return s << "real=" << t.ireal
  100.    << " u=" << float(t.tmspu)/NTICKS
  101.    << " s=" << float(t.tmsps)/NTICKS << endl;
  102. }
  103. #endif