[0b990d] | 1 | //
|
---|
| 2 | // regtime.h
|
---|
| 3 | //
|
---|
| 4 | // Copyright (C) 1996 Limit Point Systems, Inc.
|
---|
| 5 | //
|
---|
| 6 | // Author: Curtis Janssen <cljanss@limitpt.com>
|
---|
| 7 | // Maintainer: LPS
|
---|
| 8 | //
|
---|
| 9 | // This file is part of the SC Toolkit.
|
---|
| 10 | //
|
---|
| 11 | // The SC Toolkit is free software; you can redistribute it and/or modify
|
---|
| 12 | // it under the terms of the GNU Library General Public License as published by
|
---|
| 13 | // the Free Software Foundation; either version 2, or (at your option)
|
---|
| 14 | // any later version.
|
---|
| 15 | //
|
---|
| 16 | // The SC Toolkit is distributed in the hope that it will be useful,
|
---|
| 17 | // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
---|
| 18 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
---|
| 19 | // GNU Library General Public License for more details.
|
---|
| 20 | //
|
---|
| 21 | // You should have received a copy of the GNU Library General Public License
|
---|
| 22 | // along with the SC Toolkit; see the file COPYING.LIB. If not, write to
|
---|
| 23 | // the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
|
---|
| 24 | //
|
---|
| 25 | // The U.S. Government is granted a limited license as per AL 91-7.
|
---|
| 26 | //
|
---|
| 27 |
|
---|
| 28 | #ifdef __GNUC__
|
---|
| 29 | #pragma interface
|
---|
| 30 | #endif
|
---|
| 31 |
|
---|
| 32 | #ifndef _util_misc_regtime_h
|
---|
| 33 | #define _util_misc_regtime_h
|
---|
| 34 |
|
---|
| 35 | #include <iostream>
|
---|
| 36 | #include <string>
|
---|
| 37 | #include <util/class/class.h>
|
---|
| 38 |
|
---|
| 39 | namespace sc {
|
---|
| 40 |
|
---|
| 41 | class TimedRegion {
|
---|
| 42 | private:
|
---|
| 43 | char *name_;
|
---|
| 44 | TimedRegion *up_;
|
---|
| 45 | TimedRegion *subregions_;
|
---|
| 46 | TimedRegion *next_;
|
---|
| 47 | TimedRegion *prev_;
|
---|
| 48 | double cpu_time_;
|
---|
| 49 | double wall_time_;
|
---|
| 50 | double cpu_enter_;
|
---|
| 51 | double wall_enter_;
|
---|
| 52 | double flops_;
|
---|
| 53 | double flops_enter_;
|
---|
| 54 |
|
---|
| 55 | TimedRegion *insert_after(const char *name);
|
---|
| 56 | TimedRegion *insert_before(const char *name);
|
---|
| 57 | public:
|
---|
| 58 | TimedRegion(const char *name);
|
---|
| 59 | ~TimedRegion();
|
---|
| 60 | const char *name() const { return name_; }
|
---|
| 61 | TimedRegion *findinsubregion(const char *);
|
---|
| 62 | void cpu_enter(double);
|
---|
| 63 | void wall_enter(double);
|
---|
| 64 | void flops_enter(double);
|
---|
| 65 | void cpu_exit(double);
|
---|
| 66 | void wall_exit(double);
|
---|
| 67 | void flops_exit(double);
|
---|
| 68 | void cpu_add(double t) { cpu_time_ += t; }
|
---|
| 69 | void wall_add(double t) { wall_time_ += t; }
|
---|
| 70 | void flops_add(double t) { flops_ += t; }
|
---|
| 71 | TimedRegion *up() const { return up_; }
|
---|
| 72 | TimedRegion *subregions() const { return subregions_; }
|
---|
| 73 | TimedRegion *next() const { return next_; }
|
---|
| 74 | TimedRegion *prev() const { return prev_; }
|
---|
| 75 |
|
---|
| 76 | int nregion();
|
---|
| 77 | void get_region_names(const char *names[]);
|
---|
| 78 | void get_wall_times(double *);
|
---|
| 79 | void get_cpu_times(double *);
|
---|
| 80 | void get_flops(double *);
|
---|
| 81 | void get_depth(int *, int depth = 0);
|
---|
| 82 | };
|
---|
| 83 |
|
---|
| 84 | /** The RegionTimer class is used to record the time spent in a section of
|
---|
| 85 | code. During the run of a code, enter and exit members are called to begin
|
---|
| 86 | and end timed sections. The print member is used to display the obtained
|
---|
| 87 | times. Multiple enter calls for a region with the same name aggregate the
|
---|
| 88 | timings. Nested regions are supported. */
|
---|
| 89 | class RegionTimer: public DescribedClass {
|
---|
| 90 | protected:
|
---|
| 91 | int wall_time_;
|
---|
| 92 | int cpu_time_;
|
---|
| 93 | int flops_;
|
---|
| 94 |
|
---|
| 95 | TimedRegion *top_;
|
---|
| 96 | TimedRegion *current_;
|
---|
| 97 | TimedRegion *default_;
|
---|
| 98 |
|
---|
| 99 | public:
|
---|
| 100 | RegionTimer(const char *topname = "total",
|
---|
| 101 | int cpu_time = 0, int wall_time = 1);
|
---|
| 102 | RegionTimer(const Ref<KeyVal> &);
|
---|
| 103 | ~RegionTimer();
|
---|
| 104 | void enter(const char * = 0);
|
---|
| 105 | void change(const char *newname, const char * oldname = 0);
|
---|
| 106 | void exit(const char * = 0, bool do_not_throw = false);
|
---|
| 107 | void set_default(const char *);
|
---|
| 108 | void unset_default();
|
---|
| 109 | void enter_default();
|
---|
| 110 | void exit_default();
|
---|
| 111 | virtual void print(std::ostream& = ExEnv::out0()) const;
|
---|
| 112 |
|
---|
| 113 | void update_top() const;
|
---|
| 114 |
|
---|
| 115 | int nregion() const;
|
---|
| 116 | void get_region_names(const char *names[]) const;
|
---|
| 117 | void get_wall_times(double *) const;
|
---|
| 118 | void get_cpu_times(double *) const;
|
---|
| 119 | void get_flops(double *) const;
|
---|
| 120 | void get_depth(int *) const;
|
---|
| 121 |
|
---|
| 122 | double get_wall_time() const;
|
---|
| 123 | double get_cpu_time() const;
|
---|
| 124 | double get_flops() const;
|
---|
| 125 |
|
---|
| 126 | void add_wall_time(const char *, double);
|
---|
| 127 | void add_cpu_time(const char *, double);
|
---|
| 128 | void add_flops(const char *, double);
|
---|
| 129 |
|
---|
| 130 | static RegionTimer *default_regiontimer();
|
---|
| 131 | static void set_default_regiontimer(const Ref<RegionTimer> &);
|
---|
| 132 | };
|
---|
| 133 |
|
---|
| 134 | /** The Timer class uses RegionTimer to time intervals in an exception safe
|
---|
| 135 | manner. It will automatically call RegionTimer::enter when its constructor
|
---|
| 136 | is called and RegionTimer::exit when its destructor is called. The reset
|
---|
| 137 | member can also result in RegionTimer's enter and exit routines being
|
---|
| 138 | called. The programmer is responsible for making sure that timers are
|
---|
| 139 | exited in the reverse of the order that they are entered. */
|
---|
| 140 | class Timer {
|
---|
| 141 | Ref<RegionTimer> timer_;
|
---|
| 142 | std::string name_;
|
---|
| 143 | bool active_;
|
---|
| 144 | public:
|
---|
| 145 | /** Start timing a region using the default RegionTimer and activate
|
---|
| 146 | the timer. If a null name pointer is given, then the
|
---|
| 147 | timer will not be activated. */
|
---|
| 148 | Timer(const char *name);
|
---|
| 149 | /** Start timing a region using the given RegionTimer. If a null name
|
---|
| 150 | pointer is given, then the timer will not be activated. */
|
---|
| 151 | Timer(const Ref<RegionTimer> &, const char *name);
|
---|
| 152 | /** Stop timing a region, if active. */
|
---|
| 153 | ~Timer();
|
---|
| 154 | /** Stop timing the current region, if active. If a new region name is
|
---|
| 155 | passed in, start timing with that name. If no region name is
|
---|
| 156 | given, the Timer will be deactivated. */
|
---|
| 157 | void reset(const char * = 0);
|
---|
| 158 | };
|
---|
| 159 |
|
---|
| 160 | }
|
---|
| 161 |
|
---|
| 162 | #endif
|
---|
| 163 |
|
---|
| 164 | // Local Variables:
|
---|
| 165 | // mode: c++
|
---|
| 166 | // c-file-style: "CLJ"
|
---|
| 167 | // End:
|
---|