Skip to content

Commit a34e15c

Browse files
committed
Optimize succinctDuration by avoid creating two objects
1 parent a7306e2 commit a34e15c

File tree

1 file changed

+33
-14
lines changed

1 file changed

+33
-14
lines changed

src/main/java/io/airlift/units/Duration.java

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ public static Duration succinctDuration(double value, TimeUnit unit)
6363
if (value == 0) {
6464
return ZERO;
6565
}
66-
return new Duration(value, unit).convertToMostSuccinctTimeUnit();
66+
67+
TimeUnit succinctUnit = succinctUnit(value, unit);
68+
if (succinctUnit == unit) {
69+
return new Duration(value, unit);
70+
}
71+
return new Duration(convertValue(value, unit, succinctUnit), succinctUnit);
6772
}
6873

6974
private final double value;
@@ -101,8 +106,7 @@ public TimeUnit getUnit()
101106

102107
public double getValue(TimeUnit timeUnit)
103108
{
104-
requireNonNull(timeUnit, "timeUnit is null");
105-
return value * (millisPerTimeUnit(this.unit) / millisPerTimeUnit(timeUnit));
109+
return convertValue(value, unit, timeUnit);
106110
}
107111

108112
public long roundTo(TimeUnit timeUnit)
@@ -125,17 +129,7 @@ public Duration convertTo(TimeUnit timeUnit)
125129

126130
public Duration convertToMostSuccinctTimeUnit()
127131
{
128-
TimeUnit unitToUse = NANOSECONDS;
129-
for (TimeUnit unitToTest : TIME_UNITS) {
130-
// since time units are powers of ten, we can get rounding errors here, so fuzzy match
131-
if (getValue(unitToTest) > 0.9999) {
132-
unitToUse = unitToTest;
133-
}
134-
else {
135-
break;
136-
}
137-
}
138-
return convertTo(unitToUse);
132+
return convertTo(succinctUnit(value, unit));
139133
}
140134

141135
public java.time.Duration toJavaTime()
@@ -204,6 +198,31 @@ public static Duration valueOf(String duration)
204198
return new Duration(value, timeUnit);
205199
}
206200

201+
private static TimeUnit succinctUnit(double value, TimeUnit unit)
202+
{
203+
TimeUnit unitToUse = NANOSECONDS;
204+
for (TimeUnit unitToTest : TIME_UNITS) {
205+
if (convertValue(value, unit, unitToTest) > 0.9999) {
206+
unitToUse = unitToTest;
207+
}
208+
else {
209+
break;
210+
}
211+
}
212+
return unitToUse;
213+
}
214+
215+
private static double convertValue(double value, TimeUnit fromUnit, TimeUnit toUnit)
216+
{
217+
requireNonNull(fromUnit, "fromUnit is null");
218+
requireNonNull(toUnit, "toUnit is null");
219+
if (fromUnit == toUnit) {
220+
return value;
221+
}
222+
223+
return value * (millisPerTimeUnit(fromUnit) / millisPerTimeUnit(toUnit));
224+
}
225+
207226
@Override
208227
public int compareTo(Duration o)
209228
{

0 commit comments

Comments
 (0)