Add Character#digit(int, int) fastpath
Added a java fastpath for common cases in the
Character#digit(int, int) method. Improves performance
of conversions from string to numeric types.
Bug: 28008616
Change-Id: I28aacba520c3f51a5cb5a59e51d4ae593daa551c
(cherry picked from commit cff29861633f2d4907b79644dace4a6790982faf)
diff --git a/benchmarks/src/benchmarks/regression/IntegerBenchmark.java b/benchmarks/src/benchmarks/regression/IntegerBenchmark.java
index f7f97c7..c9614d4 100644
--- a/benchmarks/src/benchmarks/regression/IntegerBenchmark.java
+++ b/benchmarks/src/benchmarks/regression/IntegerBenchmark.java
@@ -133,4 +133,16 @@
}
return t;
}
+
+ public int timeIntegerValueOf(int reps) throws Exception {
+ String[] intStrings = new String[]{"0", "1", "12", "123", "1234", "12345",
+ "123456", "1234567", "12345678"};
+ int t = 0;
+ for (int i = 0; i < reps; ++i) {
+ for (int j = 0; j < intStrings.length; ++j) {
+ t += Integer.valueOf(intStrings[j]);
+ }
+ }
+ return t;
+ }
}
diff --git a/ojluni/src/main/java/java/lang/Character.java b/ojluni/src/main/java/java/lang/Character.java
index bb69d91..5b9038a 100755
--- a/ojluni/src/main/java/java/lang/Character.java
+++ b/ojluni/src/main/java/java/lang/Character.java
@@ -6458,6 +6458,21 @@
* @since 1.5
*/
public static int digit(int codePoint, int radix) {
+ if (radix < MIN_RADIX || radix > MAX_RADIX) {
+ return -1;
+ }
+ if (codePoint < 128) {
+ // Optimized for ASCII
+ int result = -1;
+ if ('0' <= codePoint && codePoint <= '9') {
+ result = codePoint - '0';
+ } else if ('a' <= codePoint && codePoint <= 'z') {
+ result = 10 + (codePoint - 'a');
+ } else if ('A' <= codePoint && codePoint <= 'Z') {
+ result = 10 + (codePoint - 'A');
+ }
+ return result < radix ? result : -1;
+ }
return digitImpl(codePoint, radix);
}