Skip to content

Commit c9920e3

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

File tree

1 file changed

+34
-14
lines changed

1 file changed

+34
-14
lines changed

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

Lines changed: 34 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,32 @@ 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+
// since time units are powers of ten, we can get rounding errors here, so fuzzy match
206+
if (convertValue(value, unit, unitToTest) > 0.9999) {
207+
unitToUse = unitToTest;
208+
}
209+
else {
210+
break;
211+
}
212+
}
213+
return unitToUse;
214+
}
215+
216+
private static double convertValue(double value, TimeUnit fromUnit, TimeUnit toUnit)
217+
{
218+
requireNonNull(fromUnit, "fromUnit is null");
219+
requireNonNull(toUnit, "toUnit is null");
220+
if (fromUnit == toUnit) {
221+
return value;
222+
}
223+
224+
return value * (millisPerTimeUnit(fromUnit) / millisPerTimeUnit(toUnit));
225+
}
226+
207227
@Override
208228
public int compareTo(Duration o)
209229
{

0 commit comments

Comments
 (0)