Skip to content

Commit 0fb75c1

Browse files
Use cache for base time unit strings (#4487)
* Use cache for base time unit strings Closes gh-4352 * Polish "Use cache for base time unit strings" --------- Co-authored-by: Jonatan Ivanov <[email protected]>
1 parent 29e437b commit 0fb75c1

File tree

2 files changed

+23
-1
lines changed

2 files changed

+23
-1
lines changed

micrometer-core/src/main/java/io/micrometer/core/instrument/MeterRegistry.java

+14-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.concurrent.TimeUnit;
3737
import java.util.concurrent.atomic.AtomicBoolean;
3838
import java.util.function.*;
39+
import java.util.stream.Collectors;
3940

4041
import static java.lang.String.format;
4142
import static java.util.Collections.emptyList;
@@ -59,6 +60,18 @@
5960
*/
6061
public abstract class MeterRegistry {
6162

63+
// @formatter:off
64+
private static final EnumMap<TimeUnit, String> BASE_TIME_UNIT_STRING_CACHE = Arrays.stream(TimeUnit.values())
65+
.collect(
66+
Collectors.toMap(
67+
Function.identity(),
68+
(timeUnit) -> timeUnit.toString().toLowerCase(),
69+
(k, v) -> { throw new IllegalStateException("Duplicate keys should not exist."); },
70+
() -> new EnumMap<>(TimeUnit.class)
71+
)
72+
);
73+
// @formatter:on
74+
6275
protected final Clock clock;
6376

6477
private final Object meterMapLock = new Object();
@@ -280,7 +293,7 @@ protected String getConventionName(Meter.Id id) {
280293
protected abstract DistributionStatisticConfig defaultHistogramConfig();
281294

282295
private String getBaseTimeUnitStr() {
283-
return getBaseTimeUnit().toString().toLowerCase();
296+
return BASE_TIME_UNIT_STRING_CACHE.get(getBaseTimeUnit());
284297
}
285298

286299
/**

micrometer-core/src/test/java/io/micrometer/core/instrument/MeterRegistryTest.java

+9
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package io.micrometer.core.instrument;
1717

18+
import io.micrometer.core.Issue;
1819
import io.micrometer.core.instrument.config.MeterFilter;
1920
import io.micrometer.core.instrument.config.MeterFilterReply;
2021
import io.micrometer.core.instrument.distribution.DistributionStatisticConfig;
@@ -205,4 +206,12 @@ void shouldNotLetRegisteringMetersTwice() {
205206
.hasNoCause();
206207
}
207208

209+
@Test
210+
@Issue("#4352")
211+
void baseUnitStringShouldBeCachedAndReturnTheSameInstance() {
212+
Timer timer1 = registry.timer("test.timer1");
213+
Timer timer2 = registry.timer("test.timer2");
214+
assertThat(timer1.getId().getBaseUnit()).isSameAs(timer2.getId().getBaseUnit());
215+
}
216+
208217
}

0 commit comments

Comments
 (0)