RFR: 8359424: Eliminate table lookup in Integer/Long toHexString

Shaojin Wen swen at openjdk.org
Fri Jun 13 13:25:29 UTC 2025


On Tue, 7 Jan 2025 10:39:18 GMT, Shaojin Wen <swen at openjdk.org> wrote:

> In PR #22928, UUID introduced long-based vectorized hexadecimal to string conversion, which can also be used in Integer::toHexString and Long::toHexString to eliminate table lookups. The benefit of eliminating table lookups is that the performance is better when cache misses occur.

Performance test figures show that using the vectorized method toHex can improve performance in most cases by eliminating table lookups.

## 1. Script

git remote add wenshao git at github.com:wenshao/jdk.git
git fetch wenshao

# baseline
git checkout 7731f4df6ba12b4e38f17f87bd42b1da6dc68f95
make test TEST="micro:java.lang.Integers.toHexString"
make test TEST="micro:java.lang.Longs.toHexString"
           
 # current
git checkout 6f491cedc2311115ab81b479620da3eb71385fc8
make test TEST="micro:java.lang.Integers.toHexString"
make test TEST="micro:java.lang.Longs.toHexString"


## 2. aliyun_ecs_c8a_x64 (CPU AMD EPYC™ Genoa)

-# 7731f4df6ba12b4e38f17f87bd42b1da6dc68f95
-Benchmark                  (size)  Mode  Cnt  Score   Error  Units
-Longs.toHexStringBig          500  avgt   15  5.984 ± 0.009  us/op
-Longs.toHexStringSmall        500  avgt   15  3.989 ± 0.036  us/op
-Integers.toHexStringBig       500  avgt   15  4.473 ± 0.029  us/op
-Integers.toHexStringSmall     500  avgt   15  4.166 ± 0.120  us/op
-Integers.toHexStringTiny      500  avgt   15  3.394 ± 0.014  us/op

+# 6f491cedc2311115ab81b479620da3eb71385fc8
+Benchmark                  (size)  Mode  Cnt  Score   Error  Units
+Longs.toHexStringBig          500  avgt   15  4.622 ± 0.011  us/op +29%
+Longs.toHexStringSmall        500  avgt   15  3.957 ± 0.035  us/op +0.8%
+Integers.toHexStringBig       500  avgt   15  3.985 ± 0.019  us/op +12.24%
+Integers.toHexStringSmall     500  avgt   15  3.617 ± 0.020  us/op +15.17%
+Integers.toHexStringTiny      500  avgt   15  3.033 ± 0.015  us/op +11.90%



## 3. aliyun_ecs_c8i_x64 (CPU Intel®Xeon®Emerald Rapids)

-# 7731f4df6ba12b4e38f17f87bd42b1da6dc68f95
-Benchmark                  (size)  Mode  Cnt  Score   Error  Units
-Longs.toHexStringBig          500  avgt   15  5.685 ± 0.019  us/op
-Longs.toHexStringSmall        500  avgt   15  3.914 ± 0.009  us/op
-Integers.toHexStringBig       500  avgt   15  4.262 ± 0.025  us/op
-Integers.toHexStringSmall     500  avgt   15  4.049 ± 0.012  us/op
-Integers.toHexStringTiny      500  avgt   15  3.323 ± 0.015  us/op

+# 6f491cedc2311115ab81b479620da3eb71385fc8
+Benchmark                  (size)  Mode  Cnt  Score   Error  Units
+Longs.toHexStringBig          500  avgt   15  4.791 ± 0.005  us/op
+Longs.toHexStringSmall        500  avgt   15  3.994 ± 0.022  us/op
+Integers.toHexStringBig       500  avgt   15  4.184 ± 0.034  us/op
+Integers.toHexStringSmall     500  avgt   15  3.771 ± 0.019  us/op
+Integers.toHexStringTiny      500  avgt   15  3.133 ± 0.021  us/op



## 4. aliyun_ecs_c8y_aarch64 (CPU Aliyun Yitian 710)

-# 7731f4df6ba12b4e38f17f87bd42b1da6dc68f95
-Benchmark                  (size)  Mode  Cnt  Score   Error  Units
-Longs.toHexStringBig          500  avgt   15  8.319 ± 0.139  us/op
-Longs.toHexStringSmall        500  avgt   15  4.985 ± 0.028  us/op
-Integers.toHexStringBig       500  avgt   15  5.489 ± 0.041  us/op
-Integers.toHexStringSmall     500  avgt   15  5.028 ± 0.033  us/op
-Integers.toHexStringTiny      500  avgt   15  3.921 ± 0.023  us/op

+# 6f491cedc2311115ab81b479620da3eb71385fc8
+Benchmark                  (size)  Mode  Cnt  Score   Error  Units
+Longs.toHexStringBig          500  avgt   15  5.346 ± 0.033  us/op
+Longs.toHexStringSmall        500  avgt   15  4.383 ± 0.027  us/op
+Integers.toHexStringBig       500  avgt   15  4.821 ± 0.052  us/op
+Integers.toHexStringSmall     500  avgt   15  4.428 ± 0.036  us/op
+Integers.toHexStringTiny      500  avgt   15  3.800 ± 0.046  us/op




## 5. MacBook M1 Pro (aarch64)

-# 7731f4df6ba12b4e38f17f87bd42b1da6dc68f95
-Benchmark                  (size)  Mode  Cnt   Score   Error  Units
-Longs.toHexStringBig          500  avgt   15  6.878 ± 0.230  us/op
-Longs.toHexStringSmall        500  avgt   15  4.975 ± 0.381  us/op
-Integers.toHexStringBig       500  avgt   15  11.646 ± 2.699  us/op
-Integers.toHexStringSmall     500  avgt   15   5.040 ± 0.319  us/op
-Integers.toHexStringTiny      500  avgt   15   2.717 ± 0.023  us/op

+# 6f491cedc2311115ab81b479620da3eb71385fc8
+Benchmark                  (size)  Mode  Cnt  Score   Error  Units
+Longs.toHexStringBig          500  avgt   15  4.007 ± 0.023  us/op
+Longs.toHexStringSmall        500  avgt   15  3.058 ± 0.024  us/op
+Integers.toHexStringBig       500  avgt   15  3.399 ± 0.017  us/op
+Integers.toHexStringSmall     500  avgt   15  3.163 ± 0.026  us/op
+Integers.toHexStringTiny      500  avgt   15  2.909 ± 0.026  us/op

-------------

PR Comment: https://git.openjdk.org/jdk/pull/22942#issuecomment-2970383406


More information about the core-libs-dev mailing list