View Javadoc
1   /**
2    * Copyright (c) 2004-2011 QOS.ch
3    * All rights reserved.
4    *
5    * Permission is hereby granted, free  of charge, to any person obtaining
6    * a  copy  of this  software  and  associated  documentation files  (the
7    * "Software"), to  deal in  the Software without  restriction, including
8    * without limitation  the rights to  use, copy, modify,  merge, publish,
9    * distribute,  sublicense, and/or sell  copies of  the Software,  and to
10   * permit persons to whom the Software  is furnished to do so, subject to
11   * the following conditions:
12   *
13   * The  above  copyright  notice  and  this permission  notice  shall  be
14   * included in all copies or substantial portions of the Software.
15   *
16   * THE  SOFTWARE IS  PROVIDED  "AS  IS", WITHOUT  WARRANTY  OF ANY  KIND,
17   * EXPRESS OR  IMPLIED, INCLUDING  BUT NOT LIMITED  TO THE  WARRANTIES OF
18   * MERCHANTABILITY,    FITNESS    FOR    A   PARTICULAR    PURPOSE    AND
19   * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20   * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21   * OF CONTRACT, TORT OR OTHERWISE,  ARISING FROM, OUT OF OR IN CONNECTION
22   * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23   *
24   */
25  package org.slf4j.profiler;
26  
27  import java.text.DecimalFormat;
28  
29  /**
30   * 
31   * A collection of utility methods.
32   * 
33   * @author Ceki Gülcü
34   *  
35   */
36  class Util {
37  
38      static final long NANOS_IN_ONE_MICROSECOND = 1000;
39      static final long NANOS_IN_ONE_MILLISECOND = NANOS_IN_ONE_MICROSECOND * 1000;
40      static final long NANOS_IN_ONE_SECOND = NANOS_IN_ONE_MILLISECOND * 1000;
41      private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.000");
42  
43      static DurationUnit selectDurationUnitForDisplay(StopWatch sw) {
44          return selectDurationUnitForDisplay(sw.elapsedTime());
45      }
46  
47      static DurationUnit selectDurationUnitForDisplay(long durationInNanos) {
48          if (durationInNanos < 10 * NANOS_IN_ONE_MICROSECOND) {
49              return DurationUnit.NANOSECOND;
50          } else if (durationInNanos < 10 * NANOS_IN_ONE_MILLISECOND) {
51              return DurationUnit.MICROSECOND;
52          } else if (durationInNanos < 10 * NANOS_IN_ONE_SECOND) {
53              return DurationUnit.MILLISSECOND;
54          } else {
55              return DurationUnit.SECOND;
56          }
57      }
58  
59      static public double convertToMicros(long nanos) {
60          return (double) nanos / NANOS_IN_ONE_MICROSECOND;
61      }
62  
63      static public double convertToMillis(long nanos) {
64          return (double) nanos / NANOS_IN_ONE_MILLISECOND;
65      }
66  
67      static public double convertToSeconds(long nanos) {
68          return ((double) nanos / NANOS_IN_ONE_SECOND);
69      }
70  
71      static String durationInDurationUnitsAsStr(StringBuilder buf, StopWatch sw) {
72          DurationUnit du = selectDurationUnitForDisplay(sw);
73          return durationInDurationUnitsAsStr(sw.elapsedTime(), du);
74      }
75  
76      static String durationInDurationUnitsAsStr(long nanos, DurationUnit durationUnit) {
77          StringBuilder buf = new StringBuilder();
78          switch (durationUnit) {
79          case NANOSECOND:
80              buf.append(nanos);
81              break;
82          case MICROSECOND:
83              double micros = convertToMicros(nanos);
84              buf.append(DECIMAL_FORMAT.format(micros));
85              break;
86          case MILLISSECOND:
87              double millis = convertToMillis(nanos);
88              buf.append(DECIMAL_FORMAT.format(millis));
89              break;
90          case SECOND:
91              double seconds = convertToSeconds(nanos);
92              buf.append(DECIMAL_FORMAT.format(seconds));
93              break;
94          }
95          return buf.toString();
96      }
97  
98      static void appendDurationUnitAsStr(StringBuilder buf, DurationUnit durationUnit) {
99          switch (durationUnit) {
100         case NANOSECOND:
101             buf.append("nanoseconds.");
102             break;
103         case MICROSECOND:
104             buf.append("microseconds.");
105             break;
106         case MILLISSECOND:
107             buf.append("milliseconds.");
108             break;
109         case SECOND:
110             buf.append(" seconds.");
111             break;
112         }
113     }
114 }