RFR: 8310929: Optimization for Integer.toString [v3]

温绍锦 duke at openjdk.org
Fri Jun 30 01:03:30 UTC 2023


> Speed up Integer.toString with a precomputed cache array of length 1000, use division by 1000, so that each iteration can calculate three digits.  
> 
> this optimization can also be used in StringBuilder#appent(int) and Long#toString.
> 
> # Benchmark Result
> 
> 
> bash configure --with-jmh=build/jmh/jars
> make test TEST="micro:java.lang.Integers.toString*"
> 
> 
> ## 1. [aliyun_ecs_c8i.xlarge](https://help.aliyun.com/document_detail/25378.html#c8i)
> * cpu : intel xeon sapphire rapids (x64)
> ``` diff
> -Benchmark               (size)  Mode  Cnt  Score   Error  Units (baseline)
> -Integers.toStringBig       500  avgt   15  6.811 ± 0.016  us/op
> -Integers.toStringSmall     500  avgt   15  4.794 ± 0.011  us/op
> -Integers.toStringTiny      500  avgt   15  3.752 ± 0.065  us/op
> 
> +Benchmark               (size)  Mode  Cnt  Score   Error  Units (PR commit-id 3355d211)
> +Integers.toStringBig       500  avgt   15  5.148 ± 0.044  us/op (+32.30%)
> +Integers.toStringSmall     500  avgt   15  3.820 ± 0.016  us/op (+25.48%)
> +Integers.toStringTiny      500  avgt   15  3.426 ± 0.010  us/op (+9.51%)
> 
> 
> ## 2. [aliyun_ecs_c8a.xlarge](https://help.aliyun.com/document_detail/25378.html#c8a)
> * cpu : amd epc genoa (x64)
> ``` diff
> -Benchmark               (size)  Mode  Cnt  Score   Error  Units (baseline)
> -Integers.toStringBig       500  avgt   15  6.762 ± 0.018  us/op
> -Integers.toStringSmall     500  avgt   15  4.481 ± 0.004  us/op
> -Integers.toStringTiny      500  avgt   15  2.761 ± 0.012  us/op
> 
> +Benchmark               (size)  Mode  Cnt  Score   Error  Units (PR commit-id 3355d211)
> +Integers.toStringBig       500  avgt   15  4.901 ± 0.005  us/op (+37.97%)
> +Integers.toStringSmall     500  avgt   15  3.515 ± 0.204  us/op (+27.48%)
> +Integers.toStringTiny      500  avgt   15  2.698 ± 0.190  us/op (+2.33%)
> 
> 
> ## 3. [aliyun_ecs_c8y.xlarge](https://help.aliyun.com/document_detail/25378.html#c8y)
> * cpu : aliyun yitian 710 (aarch64)
> ``` diff
> -Benchmark               (size)  Mode  Cnt   Score   Error  Units (baseline)
> -Integers.toStringBig       500  avgt   15  12.081 ± 0.377  us/op
> -Integers.toStringSmall     500  avgt   15   7.119 ± 0.177  us/op
> -Integers.toStringTiny      500  avgt   15   6.323 ± 0.239  us/op
> 
> +Benchmark               (size)  Mode  Cnt  Score   Error  Units (PR commit-id 3355d211)
> +Integers.toStringBig       500  avgt   15  8.279 ± 0.184  us/op (+45.92%)
> +Integers.toStringSmall     500  avgt   15  7.232 ± 0.239  us/op (-1.52%)
> +Integers.toStringTiny      500  avgt   15  6.850 ± 0.185  us/op (-7.69%)...

温绍锦 has updated the pull request incrementally with one additional commit since the last revision:

  improve based on getChars

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/14699/files
  - new: https://git.openjdk.org/jdk/pull/14699/files/3355d211..62b499d6

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=14699&range=02
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=14699&range=01-02

  Stats: 192 lines in 1 file changed: 37 ins; 150 del; 5 mod
  Patch: https://git.openjdk.org/jdk/pull/14699.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/14699/head:pull/14699

PR: https://git.openjdk.org/jdk/pull/14699


More information about the core-libs-dev mailing list