001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.mmtk.utility.statistics;
014
015 import org.mmtk.utility.Log;
016 import org.mmtk.vm.VM;
017
018 import org.vmmagic.pragma.*;
019
020 /**
021 * This class implements a simple timer.
022 */
023 @Uninterruptible
024 public class Timer extends LongCounter {
025
026 /****************************************************************************
027 *
028 * Initialization
029 */
030
031 /**
032 * Constructor
033 *
034 * @param name The name to be associated with this counter
035 */
036 public Timer(String name) {
037 this(name, true, false);
038 }
039
040 /**
041 * Constructor
042 *
043 * @param name The name to be associated with this counter
044 * @param start True if this counter is to be implicitly started
045 * when <code>startAll()</code> is called (otherwise the counter
046 * must be explicitly started).
047 */
048 public Timer(String name, boolean start) {
049 this(name, start, false);
050 }
051
052 /**
053 * Constructor
054 *
055 * @param name The name to be associated with this counter
056 * @param start True if this counter is to be implicitly started
057 * when <code>startAll()</code> is called (otherwise the counter
058 * must be explicitly started).
059 * @param mergephases True if this counter does not separately
060 * report GC and Mutator phases.
061 */
062 public Timer(String name, boolean start, boolean mergephases) {
063 super(name, start, mergephases);
064 }
065
066 /****************************************************************************
067 *
068 * Counter-specific methods
069 */
070
071 /**
072 * Get the current value for this timer
073 *
074 * @return The current value for this timer
075 */
076 @Override
077 @Inline
078 protected final long getCurrentValue() {
079 return VM.statistics.nanoTime();
080 }
081
082 /**
083 * Print the total in microseconds
084 */
085 final void printTotalMicro() {
086 printMicro(totalCount);
087 }
088
089 /**
090 * Print the total in milliseconds
091 */
092 public final void printTotalMillis() {
093 printMillis(totalCount);
094 }
095
096 /**
097 * Print the total in seconds
098 */
099 public final void printTotalSecs() {
100 printSecs(totalCount);
101 }
102
103 /**
104 * Print a value (in milliseconds)
105 *
106 * @param value The value to be printed
107 */
108 @Override
109 final void printValue(long value) {
110 printMillis(value);
111 }
112
113 /**
114 * Print a value in microseconds
115 *
116 * @param value The value to be printed
117 */
118 final void printMicro(long value) {
119 Log.write(1000 * VM.statistics.nanosToMillis(value));
120 }
121
122 /**
123 * Print a value in milliseconds
124 *
125 * @param value The value to be printed
126 */
127 final void printMillis(long value) {
128 Log.write(VM.statistics.nanosToMillis(value));
129 }
130
131 /**
132 * Print a value in seconds
133 *
134 * @param value The value to be printed
135 */
136 final void printSecs(long value) {
137 Log.write(VM.statistics.nanosToSecs(value));
138 }
139
140 /**
141 * Get the current value of the timer in milliseconds
142 */
143 final double getTotalMillis() {
144 return VM.statistics.nanosToMillis(totalCount);
145 }
146
147 }
148