summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Chang <vichang@google.com>2023-05-30 20:40:31 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2023-05-30 20:40:31 +0000
commit403234399523c9009e50f12071bb733672399690 (patch)
tree9ac081599636f4469a16fd6a53bc45144fc0703f
parentf9fe8fa3febc310b3423c310c2a776d9cd1c4a06 (diff)
parent6d8cebb23156820e21fc4499d2d381781b2444ef (diff)
downloadicu-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>
-rw-r--r--android_icu4j/src/main/java/android/icu/impl/ICUResourceBundleReader.java12
-rw-r--r--android_icu4j/src/main/java/android/icu/text/AnyTransliterator.java19
-rw-r--r--android_icu4j/src/main/java/android/icu/text/TransliteratorRegistry.java10
-rw-r--r--icu4j/main/classes/core/src/com/ibm/icu/impl/ICUResourceBundleReader.java12
-rw-r--r--icu4j/main/classes/translit/src/com/ibm/icu/text/AnyTransliterator.java19
-rw-r--r--icu4j/main/classes/translit/src/com/ibm/icu/text/TransliteratorRegistry.java10
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);