This PR seeks to improve formatting of hex digits using `java.util.HexFormat` somewhat.
This is achieved getting rid of a couple of lookup tables, caching the result of `HexFormat.of().withUpperCase()`, and removing tiny allocation that happens in the `formatHex(A, byte)` method. Improvements range from 20-40% on throughput, and some operations allocate less: Name Cnt Base Error Test Error Unit Diff% HexFormatBench.appenderLower 15 1,330 ± 0,021 1,065 ± 0,067 us/op 19,9% (p = 0,000*) :gc.alloc.rate 15 11,481 ± 0,185 0,007 ± 0,000 MB/sec -99,9% (p = 0,000*) :gc.alloc.rate.norm 15 16,009 ± 0,000 0,007 ± 0,000 B/op -100,0% (p = 0,000*) :gc.count 15 3,000 0,000 counts :gc.time 3 2,000 ms HexFormatBench.appenderLowerCached 15 1,317 ± 0,013 1,065 ± 0,054 us/op 19,1% (p = 0,000*) :gc.alloc.rate 15 11,590 ± 0,111 0,007 ± 0,000 MB/sec -99,9% (p = 0,000*) :gc.alloc.rate.norm 15 16,009 ± 0,000 0,007 ± 0,000 B/op -100,0% (p = 0,000*) :gc.count 15 3,000 0,000 counts :gc.time 3 2,000 ms HexFormatBench.appenderUpper 15 1,330 ± 0,022 1,065 ± 0,036 us/op 19,9% (p = 0,000*) :gc.alloc.rate 15 34,416 ± 0,559 0,007 ± 0,000 MB/sec -100,0% (p = 0,000*) :gc.alloc.rate.norm 15 48,009 ± 0,000 0,007 ± 0,000 B/op -100,0% (p = 0,000*) :gc.count 15 0,000 0,000 counts HexFormatBench.appenderUpperCached 15 1,353 ± 0,009 1,033 ± 0,014 us/op 23,6% (p = 0,000*) :gc.alloc.rate 15 11,284 ± 0,074 0,007 ± 0,000 MB/sec -99,9% (p = 0,000*) :gc.alloc.rate.norm 15 16,009 ± 0,000 0,007 ± 0,000 B/op -100,0% (p = 0,000*) :gc.count 15 3,000 0,000 counts :gc.time 3 2,000 ms HexFormatBench.toHexLower 15 0,198 ± 0,001 0,119 ± 0,008 us/op 40,1% (p = 0,000*) :gc.alloc.rate 15 0,007 ± 0,000 0,007 ± 0,000 MB/sec -0,0% (p = 0,816 ) :gc.alloc.rate.norm 15 0,001 ± 0,000 0,001 ± 0,000 B/op -40,1% (p = 0,000*) :gc.count 15 0,000 0,000 counts HexFormatBench.toHexLowerCached 15 0,201 ± 0,002 0,114 ± 0,001 us/op 43,0% (p = 0,000*) :gc.alloc.rate 15 0,007 ± 0,000 0,007 ± 0,000 MB/sec -0,2% (p = 0,116 ) :gc.alloc.rate.norm 15 0,001 ± 0,000 0,001 ± 0,000 B/op -43,1% (p = 0,000*) :gc.count 15 0,000 0,000 counts HexFormatBench.toHexUpper 15 0,146 ± 0,002 0,114 ± 0,001 us/op 21,6% (p = 0,000*) :gc.alloc.rate 15 0,007 ± 0,000 0,007 ± 0,000 MB/sec 0,0% (p = 0,668 ) :gc.alloc.rate.norm 15 0,001 ± 0,000 0,001 ± 0,000 B/op -21,5% (p = 0,000*) :gc.count 15 0,000 0,000 counts HexFormatBench.toHexUpperCached 15 0,199 ± 0,002 0,116 ± 0,003 us/op 41,7% (p = 0,000*) :gc.alloc.rate 15 0,007 ± 0,000 0,007 ± 0,000 MB/sec 0,0% (p = 0,684 ) :gc.alloc.rate.norm 15 0,001 ± 0,000 0,001 ± 0,000 B/op -41,7% (p = 0,000*) :gc.count 15 0,000 0,000 counts * = significant Invariant parameters used by above microbenchmarks: size: 512 ------------- Commit messages: - 8315789: Minor HexFormat performance improvements Changes: https://git.openjdk.org/jdk/pull/15591/files Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=15591&range=00 Issue: https://bugs.openjdk.org/browse/JDK-8315789 Stats: 184 lines in 2 files changed: 156 ins; 9 del; 19 mod Patch: https://git.openjdk.org/jdk/pull/15591.diff Fetch: git fetch https://git.openjdk.org/jdk.git pull/15591/head:pull/15591 PR: https://git.openjdk.org/jdk/pull/15591
