diff options
author | Victor Chang <vichang@google.com> | 2023-05-30 20:40:31 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2023-05-30 20:40:31 +0000 |
commit | 403234399523c9009e50f12071bb733672399690 (patch) | |
tree | 9ac081599636f4469a16fd6a53bc45144fc0703f | |
parent | f9fe8fa3febc310b3423c310c2a776d9cd1c4a06 (diff) | |
parent | 6d8cebb23156820e21fc4499d2d381781b2444ef (diff) | |
download | icu-403234399523c9009e50f12071bb733672399690.tar.gz |
Cherry-pick: ICU-22390 Speed-up ICU4J Transliterator.<clinit> am: 6d8cebb231
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/icu/+/23473586
Change-Id: Ic236a8500a3b66aa847469b712cb82add4e678a3
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
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); |