diff options
author | Victor Chang <vichang@google.com> | 2023-05-12 16:01:56 +0100 |
---|---|---|
committer | Cherrypicker Worker <android-build-cherrypicker-worker@google.com> | 2023-05-30 13:50:05 +0000 |
commit | 6d8cebb23156820e21fc4499d2d381781b2444ef (patch) | |
tree | 9ac081599636f4469a16fd6a53bc45144fc0703f | |
parent | ba75958cb575d4beb7cb296dbd2f6ae6063674b1 (diff) | |
download | icu-6d8cebb23156820e21fc4499d2d381781b2444ef.tar.gz |
Cherry-pick: ICU-22390 Speed-up ICU4J Transliterator.<clinit>
It reduces the method runtime by approx. 60%.
Upstream bug:
https://unicode-org.atlassian.net/browse/ICU-22390
Upstream commit:
https://github.com/unicode-org/icu/pull/2459
Bug: 266602846
Test: atest CtsIcuTestCases
(cherry picked from https://android-review.googlesource.com/q/commit:3a12f83bc34c1b62b7cf3e03c70759b2c3716100)
Merged-In: I6c3cd6009ecf528ec90717aeae9d2c05d7427f9a
Change-Id: I6c3cd6009ecf528ec90717aeae9d2c05d7427f9a
6 files changed, 42 insertions, 40 deletions
diff --git a/android_icu4j/src/main/java/android/icu/impl/ICUResourceBundleReader.java b/android_icu4j/src/main/java/android/icu/impl/ICUResourceBundleReader.java index ce7b1c73f..daadfebaf 100644 --- a/android_icu4j/src/main/java/android/icu/impl/ICUResourceBundleReader.java +++ b/android_icu4j/src/main/java/android/icu/impl/ICUResourceBundleReader.java @@ -15,6 +15,7 @@ import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.IntBuffer; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import android.icu.util.ICUException; @@ -446,13 +447,12 @@ public final class ICUResourceBundleReader { } private static String makeKeyStringFromBytes(byte[] keyBytes, int keyOffset) { - StringBuilder sb = new StringBuilder(); - byte b; - while((b = keyBytes[keyOffset]) != 0) { - ++keyOffset; - sb.append((char)b); + int end = keyOffset; + while(keyBytes[end] != 0) { + ++end; } - return sb.toString(); + int len = end - keyOffset; + return new String(keyBytes, keyOffset, len, StandardCharsets.ISO_8859_1); } private String getKey16String(int keyOffset) { if(keyOffset < localKeyLimit) { diff --git a/android_icu4j/src/main/java/android/icu/text/AnyTransliterator.java b/android_icu4j/src/main/java/android/icu/text/AnyTransliterator.java index 4dd5396a1..abde1d386 100644 --- a/android_icu4j/src/main/java/android/icu/text/AnyTransliterator.java +++ b/android_icu4j/src/main/java/android/icu/text/AnyTransliterator.java @@ -53,6 +53,12 @@ class AnyTransliterator extends Transliterator { static final String LATIN_PIVOT = "-Latin;Latin-"; /** + * Special code for handling width characters + */ + private static final Transliterator WIDTH_FIX = + Transliterator.getInstance("[[:dt=Nar:][:dt=Wide:]] nfkd"); + + /** * Cache mapping UScriptCode values to Transliterator*. */ private ConcurrentHashMap<Integer, Transliterator> cache; @@ -68,11 +74,6 @@ class AnyTransliterator extends Transliterator { private int targetScript; /** - * Special code for handling width characters - */ - private Transliterator widthFix = Transliterator.getInstance("[[:dt=Nar:][:dt=Wide:]] nfkd"); - - /** * Implements {@link Transliterator#handleTransliterate}. */ @Override @@ -176,7 +177,7 @@ class AnyTransliterator extends Transliterator { if (isWide(targetScript)) { return null; } else { - return widthFix; + return WIDTH_FIX; } } @@ -201,7 +202,7 @@ class AnyTransliterator extends Transliterator { if (t != null) { if (!isWide(targetScript)) { List<Transliterator> v = new ArrayList<Transliterator>(); - v.add(widthFix); + v.add(WIDTH_FIX); v.add(t); t = new CompoundTransliterator(v); } @@ -210,7 +211,7 @@ class AnyTransliterator extends Transliterator { t = prevCachedT; } } else if (!isWide(targetScript)) { - return widthFix; + return WIDTH_FIX; } } @@ -408,7 +409,7 @@ class AnyTransliterator extends Transliterator { if (filter != null && filter instanceof UnicodeSet) { filter = new UnicodeSet((UnicodeSet)filter); } - return new AnyTransliterator(getID(), filter, target, targetScript, widthFix, cache); + return new AnyTransliterator(getID(), filter, target, targetScript, WIDTH_FIX, cache); } /* (non-Javadoc) diff --git a/android_icu4j/src/main/java/android/icu/text/TransliteratorRegistry.java b/android_icu4j/src/main/java/android/icu/text/TransliteratorRegistry.java index 2819d02f1..d7b2dbe3d 100644 --- a/android_icu4j/src/main/java/android/icu/text/TransliteratorRegistry.java +++ b/android_icu4j/src/main/java/android/icu/text/TransliteratorRegistry.java @@ -17,11 +17,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; +import java.util.Set; import android.icu.impl.ICUData; import android.icu.impl.ICUResourceBundle; @@ -70,7 +72,7 @@ class TransliteratorRegistry { /** * Vector of public full IDs (CaseInsensitiveString objects). */ - private List<CaseInsensitiveString> availableIDs; + private final Set<CaseInsensitiveString> availableIDs; //---------------------------------------------------------------------- // class Spec @@ -294,7 +296,7 @@ class TransliteratorRegistry { public TransliteratorRegistry() { registry = Collections.synchronizedMap(new HashMap<CaseInsensitiveString, Object[]>()); specDAG = Collections.synchronizedMap(new HashMap<CaseInsensitiveString, Map<CaseInsensitiveString, List<CaseInsensitiveString>>>()); - availableIDs = new ArrayList<CaseInsensitiveString>(); + availableIDs = new LinkedHashSet<>(); } /** @@ -521,9 +523,7 @@ class TransliteratorRegistry { registry.put(ciID, arrayOfObj); if (visible) { registerSTV(source, target, variant); - if (!availableIDs.contains(ciID)) { - availableIDs.add(ciID); - } + availableIDs.add(ciID); } else { removeSTV(source, target, variant); availableIDs.remove(ciID); diff --git a/icu4j/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleReader.java b/icu4j/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleReader.java index 746b1d9c1..7800f904c 100644 --- a/icu4j/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleReader.java +++ b/icu4j/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleReader.java @@ -14,6 +14,7 @@ import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.nio.CharBuffer; import java.nio.IntBuffer; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import com.ibm.icu.util.ICUException; @@ -444,13 +445,12 @@ public final class ICUResourceBundleReader { } private static String makeKeyStringFromBytes(byte[] keyBytes, int keyOffset) { - StringBuilder sb = new StringBuilder(); - byte b; - while((b = keyBytes[keyOffset]) != 0) { - ++keyOffset; - sb.append((char)b); + int end = keyOffset; + while(keyBytes[end] != 0) { + ++end; } - return sb.toString(); + int len = end - keyOffset; + return new String(keyBytes, keyOffset, len, StandardCharsets.ISO_8859_1); } private String getKey16String(int keyOffset) { if(keyOffset < localKeyLimit) { diff --git a/icu4j/main/classes/translit/src/com/ibm/icu/text/AnyTransliterator.java b/icu4j/main/classes/translit/src/com/ibm/icu/text/AnyTransliterator.java index d7fbcb3b3..b051a6798 100644 --- a/icu4j/main/classes/translit/src/com/ibm/icu/text/AnyTransliterator.java +++ b/icu4j/main/classes/translit/src/com/ibm/icu/text/AnyTransliterator.java @@ -53,6 +53,12 @@ class AnyTransliterator extends Transliterator { static final String LATIN_PIVOT = "-Latin;Latin-"; /** + * Special code for handling width characters + */ + private static final Transliterator WIDTH_FIX = + Transliterator.getInstance("[[:dt=Nar:][:dt=Wide:]] nfkd"); + + /** * Cache mapping UScriptCode values to Transliterator*. */ private ConcurrentHashMap<Integer, Transliterator> cache; @@ -68,11 +74,6 @@ class AnyTransliterator extends Transliterator { private int targetScript; /** - * Special code for handling width characters - */ - private Transliterator widthFix = Transliterator.getInstance("[[:dt=Nar:][:dt=Wide:]] nfkd"); - - /** * Implements {@link Transliterator#handleTransliterate}. */ @Override @@ -176,7 +177,7 @@ class AnyTransliterator extends Transliterator { if (isWide(targetScript)) { return null; } else { - return widthFix; + return WIDTH_FIX; } } @@ -201,7 +202,7 @@ class AnyTransliterator extends Transliterator { if (t != null) { if (!isWide(targetScript)) { List<Transliterator> v = new ArrayList<Transliterator>(); - v.add(widthFix); + v.add(WIDTH_FIX); v.add(t); t = new CompoundTransliterator(v); } @@ -210,7 +211,7 @@ class AnyTransliterator extends Transliterator { t = prevCachedT; } } else if (!isWide(targetScript)) { - return widthFix; + return WIDTH_FIX; } } @@ -408,7 +409,7 @@ class AnyTransliterator extends Transliterator { if (filter != null && filter instanceof UnicodeSet) { filter = new UnicodeSet((UnicodeSet)filter); } - return new AnyTransliterator(getID(), filter, target, targetScript, widthFix, cache); + return new AnyTransliterator(getID(), filter, target, targetScript, WIDTH_FIX, cache); } /* (non-Javadoc) diff --git a/icu4j/main/classes/translit/src/com/ibm/icu/text/TransliteratorRegistry.java b/icu4j/main/classes/translit/src/com/ibm/icu/text/TransliteratorRegistry.java index b39d8353c..be6bda496 100644 --- a/icu4j/main/classes/translit/src/com/ibm/icu/text/TransliteratorRegistry.java +++ b/icu4j/main/classes/translit/src/com/ibm/icu/text/TransliteratorRegistry.java @@ -16,11 +16,13 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Enumeration; import java.util.HashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; +import java.util.Set; import com.ibm.icu.impl.ICUData; import com.ibm.icu.impl.ICUResourceBundle; @@ -69,7 +71,7 @@ class TransliteratorRegistry { /** * Vector of public full IDs (CaseInsensitiveString objects). */ - private List<CaseInsensitiveString> availableIDs; + private final Set<CaseInsensitiveString> availableIDs; //---------------------------------------------------------------------- // class Spec @@ -293,7 +295,7 @@ class TransliteratorRegistry { public TransliteratorRegistry() { registry = Collections.synchronizedMap(new HashMap<CaseInsensitiveString, Object[]>()); specDAG = Collections.synchronizedMap(new HashMap<CaseInsensitiveString, Map<CaseInsensitiveString, List<CaseInsensitiveString>>>()); - availableIDs = new ArrayList<CaseInsensitiveString>(); + availableIDs = new LinkedHashSet<>(); } /** @@ -520,9 +522,7 @@ class TransliteratorRegistry { registry.put(ciID, arrayOfObj); if (visible) { registerSTV(source, target, variant); - if (!availableIDs.contains(ciID)) { - availableIDs.add(ciID); - } + availableIDs.add(ciID); } else { removeSTV(source, target, variant); availableIDs.remove(ciID); |