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 #ifdef __GNUC__
00029 #pragma interface
00030 #endif
00031
00032 #ifndef _util_misc_regtime_h
00033 #define _util_misc_regtime_h
00034
00035 #include <iostream>
00036 #include <string>
00037 #include <list>
00038 #include <scconfig.h>
00039 #include <util/class/class.h>
00040
00041 namespace sc {
00042
00044 class TimedRegion {
00045 private:
00046 char *name_;
00047 TimedRegion *up_;
00048 TimedRegion *subregions_;
00049 TimedRegion *next_;
00050 TimedRegion *prev_;
00051 double cpu_time_;
00052 double wall_time_;
00053 double cpu_enter_;
00054 double wall_enter_;
00055 double flops_;
00056 double flops_enter_;
00057
00058 TimedRegion *insert_after(const char *name);
00059 TimedRegion *insert_before(const char *name);
00060 public:
00061 TimedRegion(const char *name);
00062 ~TimedRegion();
00063 const char *name() const { return name_; }
00064 TimedRegion *findinsubregion(const char *);
00065 void cpu_enter(double);
00066 void wall_enter(double);
00067 void flops_enter(double);
00068 void cpu_exit(double);
00069 void wall_exit(double);
00070 void flops_exit(double);
00071 void cpu_add(double t) { cpu_time_ += t; }
00072 void wall_add(double t) { wall_time_ += t; }
00073 void flops_add(double t) { flops_ += t; }
00074 TimedRegion *up() const { return up_; }
00075 TimedRegion *subregions() const { return subregions_; }
00076 TimedRegion *next() const { return next_; }
00077 TimedRegion *prev() const { return prev_; }
00078
00080 void merge(const TimedRegion* r);
00081
00082 int nregion();
00083 void get_region_names(const char *names[]);
00084 void get_wall_times(double *);
00085 void get_cpu_times(double *);
00086 void get_flops(double *);
00087 void get_depth(int *, int depth = 0);
00088 };
00089
00094 class RegionTimer: public DescribedClass {
00095 protected:
00096 int wall_time_;
00097 int cpu_time_;
00098 int flops_;
00099
00100 TimedRegion *top_;
00101 TimedRegion *current_;
00102 TimedRegion *default_;
00103 std::list<TimedRegion*> defaults_;
00104
00105 public:
00106 RegionTimer(const char *topname = "total",
00107 int cpu_time = 0, int wall_time = 1);
00108 RegionTimer(const Ref<KeyVal> &);
00109 ~RegionTimer();
00110 void enter(const char * = 0);
00111 void change(const char *newname, const char * oldname = 0);
00112 void exit(const char * = 0, bool do_not_throw = false);
00113 void set_default(const char *);
00114 void unset_default();
00115 void enter_default();
00116 void exit_default();
00117 virtual void print(std::ostream& = ExEnv::out0()) const;
00118 void reset();
00119
00121 void merge(const Ref<RegionTimer> &r);
00122
00123 void update_top() const;
00124
00125 int nregion() const;
00126 void get_region_names(const char *names[]) const;
00127 void get_wall_times(double *) const;
00128 void get_cpu_times(double *) const;
00129 void get_flops(double *) const;
00130 void get_depth(int *) const;
00131
00132 double get_wall_time() const;
00133 double get_cpu_time() const;
00134 double get_flops() const;
00135
00136 void add_wall_time(const char *, double);
00137 void add_cpu_time(const char *, double);
00138 void add_flops(const char *, double);
00139
00140 static RegionTimer *default_regiontimer();
00141 static void set_default_regiontimer(const Ref<RegionTimer> &);
00142 };
00143
00150 class Timer {
00151 Ref<RegionTimer> timer_;
00152 int depth_;
00153 int default_depth_;
00154 bool default_entered_;
00155 public:
00159 Timer(const char *name);
00161 Timer(const std::string &name);
00164 Timer(const Ref<RegionTimer> &, const char *name);
00166 Timer(const Ref<RegionTimer> &, const std::string &name);
00169 Timer(const Ref<RegionTimer> &);
00172 Timer();
00174 ~Timer();
00176 void print(std::ostream& = ExEnv::out0()) const;
00181 DEPRECATED void reset(const char * = 0);
00182
00188 void enter(const char *region);
00189 void enter(const std::string ®ion) { enter(region.c_str()); }
00191
00194 void change(const char *region);
00195 void change(const std::string ®ion) { change(region.c_str()); }
00197
00200 void exit(const char *region = 0);
00201 void exit(const std::string ®ion) { this->exit(region.c_str()); }
00203
00212 void set_default(const char *region);
00213 void set_default(const std::string &r) { set_default(r.c_str()); }
00214 void unset_default();
00215 void enter_default();
00216 void exit_default();
00218 };
00219
00220 }
00221
00222 #endif
00223
00224
00225
00226
00227