summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVictor Chang <vichang@google.com>2023-05-12 16:01:56 +0100
committerCherrypicker Worker <android-build-cherrypicker-worker@google.com>2023-05-30 13:50:05 +0000
commit6d8cebb23156820e21fc4499d2d381781b2444ef (patch)
tree9ac081599636f4469a16fd6a53bc45144fc0703f
parentba75958cb575d4beb7cb296dbd2f6ae6063674b1 (diff)
downloadicu-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
-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);