From a6779a73b02040f0993d3c423fe19deff49bdb31 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Mon, 25 Apr 2022 10:22:39 +0200 Subject: [PATCH] [nls] Improve performance of narrow duration formatting Cache LocalizedNumberFormatter instances. Performance improved ~30x Fixes IDEA-291910 Slow NlsMessages.formatDurationApproximateNarrow GitOrigin-RevId: 6836b1b29d750d3d74f16f51b782473e01459cf8 --- .../src/com/intellij/ide/nls/NlsMessages.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/platform/ide-core-impl/src/com/intellij/ide/nls/NlsMessages.java b/platform/ide-core-impl/src/com/intellij/ide/nls/NlsMessages.java index 8e27746cc8e5..71ae13b0a848 100644 --- a/platform/ide-core-impl/src/com/intellij/ide/nls/NlsMessages.java +++ b/platform/ide-core-impl/src/com/intellij/ide/nls/NlsMessages.java @@ -11,6 +11,7 @@ import com.ibm.icu.util.Measure; import com.ibm.icu.util.MeasureUnit; import com.intellij.DynamicBundle; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.util.containers.ContainerUtil; import it.unimi.dsi.fastutil.ints.IntArrayList; import it.unimi.dsi.fastutil.ints.IntList; import it.unimi.dsi.fastutil.longs.LongArrayList; @@ -201,16 +202,16 @@ public class NlsMessages { } int finalCount = Math.min(unitValues.size(), maxFragments); + CachedFormats formats = getFormats(); if (narrow) { List fragments = new ArrayList<>(); - LocalizedNumberFormatter formatter = getFormats().shortNumber; for (i = 0; i < finalCount; i++) { - fragments.add(formatter.unit( - TIME_UNITS[unitIndices.getInt(i)]).format(unitValues.getLong(i)).toString().replace(' ', '\u2009')); + fragments.add(formats.shortNumberUnitFormatters[unitIndices.getInt(i)] + .format(unitValues.getLong(i)).toString().replace(' ', '\u2009')); } return StringUtil.join(fragments, " "); } - MeasureFormat format = getFormats().shortFormat; + MeasureFormat format = formats.shortFormat; Measure[] measures = new Measure[finalCount]; for (i = 0; i < finalCount; i++) { measures[i] = new Measure(unitValues.getLong(i), TIME_UNITS[unitIndices.getInt(i)]); @@ -387,7 +388,7 @@ public class NlsMessages { final Locale locale; final MeasureFormat shortFormat; final LocalizedNumberFormatter narrowNumber; - final LocalizedNumberFormatter shortNumber; + final LocalizedNumberFormatter[] shortNumberUnitFormatters; final ListFormatter andWideList; final ListFormatter andNarrowList; final ListFormatter orWideList; @@ -396,7 +397,8 @@ public class NlsMessages { this.locale = locale; this.shortFormat = MeasureFormat.getInstance(locale, MeasureFormat.FormatWidth.SHORT); LocalizedNumberFormatter numberFormatter = NumberFormatter.withLocale(locale); - this.shortNumber = numberFormatter.unitWidth(NumberFormatter.UnitWidth.SHORT); + LocalizedNumberFormatter shortNumber = numberFormatter.unitWidth(NumberFormatter.UnitWidth.SHORT); + this.shortNumberUnitFormatters = ContainerUtil.map2Array(TIME_UNITS, LocalizedNumberFormatter.class, shortNumber::unit); this.narrowNumber = numberFormatter.unitWidth(NumberFormatter.UnitWidth.NARROW); this.andWideList = ListFormatter.getInstance(DynamicBundle.getLocale(), ListFormatter.Type.AND, ListFormatter.Width.WIDE); this.orWideList = ListFormatter.getInstance(DynamicBundle.getLocale(), ListFormatter.Type.OR, ListFormatter.Width.WIDE);