timer.hpp revision 1879:f95d63e2154a
1/*
2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25#ifndef SHARE_VM_RUNTIME_TIMER_HPP
26#define SHARE_VM_RUNTIME_TIMER_HPP
27
28#include "utilities/globalDefinitions.hpp"
29
30// Timers for simple measurement.
31
32class elapsedTimer VALUE_OBJ_CLASS_SPEC {
33  friend class VMStructs;
34 private:
35  jlong _counter;
36  jlong _start_counter;
37  bool  _active;
38 public:
39  elapsedTimer()             { _active = false; reset(); }
40  void add(elapsedTimer t);
41  void start();
42  void stop();
43  void reset()               { _counter = 0; }
44  double seconds() const;
45  jlong milliseconds() const;
46  jlong ticks() const        { return _counter; }
47  jlong active_ticks() const;
48  bool  is_active() const { return _active; }
49};
50
51// TimeStamp is used for recording when an event took place.
52class TimeStamp VALUE_OBJ_CLASS_SPEC {
53 private:
54  jlong _counter;
55 public:
56  TimeStamp()  { _counter = 0; }
57  void clear() { _counter = 0; }
58  // has the timestamp been updated since being created or cleared?
59  bool is_updated() const { return _counter != 0; }
60  // update to current elapsed time
61  void update();
62  // update to given elapsed time
63  void update_to(jlong ticks);
64  // returns seconds since updated
65  // (must not be in a cleared state:  must have been previously updated)
66  double seconds() const;
67  jlong milliseconds() const;
68  // ticks elapsed between VM start and last update
69  jlong ticks() const { return _counter; }
70  // ticks elapsed since last update
71  jlong ticks_since_update() const;
72};
73
74// TraceTime is used for tracing the execution time of a block
75// Usage:
76//  { TraceTime t("block time")
77//    some_code();
78//  }
79//
80
81class TraceTime: public StackObj {
82 private:
83  bool          _active;    // do timing
84  bool          _verbose;   // report every timing
85  bool          _print_cr;  // add a CR to the end of the timer report
86  elapsedTimer  _t;         // timer
87  elapsedTimer* _accum;     // accumulator
88  outputStream* _logfile;   // output log file
89 public:
90  // Constuctors
91  TraceTime(const char* title,
92            bool doit = true,
93            bool print_cr = true,
94            outputStream *logfile = NULL);
95  TraceTime(const char* title,
96            elapsedTimer* accumulator,
97            bool doit = true,
98            bool verbose = false,
99            outputStream *logfile = NULL );
100  ~TraceTime();
101
102  // Accessors
103  void set_verbose(bool verbose)  { _verbose = verbose; }
104  bool verbose() const            { return _verbose;    }
105
106  // Activation
107  void suspend()  { if (_active) _t.stop();  }
108  void resume()   { if (_active) _t.start(); }
109};
110
111class TraceCPUTime: public StackObj {
112 private:
113  bool _active;                 // true if times will be measured and printed
114  bool _print_cr;               // if true print carriage return at end
115  double _starting_user_time;   // user time at start of measurement
116  double _starting_system_time; // system time at start of measurement
117  double _starting_real_time;   // real time at start of measurement
118  outputStream* _logfile;       // output is printed to this stream
119  bool _error;                  // true if an error occurred, turns off output
120
121 public:
122  TraceCPUTime(bool doit = true,
123               bool print_cr = true,
124               outputStream *logfile = NULL);
125  ~TraceCPUTime();
126};
127
128#endif // SHARE_VM_RUNTIME_TIMER_HPP
129