1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package org.slf4j.profiler;
26
27 import java.text.DecimalFormat;
28
29
30
31
32
33
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 }