<i18n dev> RFR: 8269665: Clean-up toString() methods of some primitive wrappers

Сергей Цыпанов github.com+10835776+stsypanov at openjdk.java.net
Wed Jun 30 08:47:24 UTC 2021


As of JDK 17 some of primitive wrappers, e.g. `Long`, `Integer`, `Double` and `Float` in their implementations of `Object.toString()` delegate to own utility `toString(primitive)` methods.

Unlike those, `Boolean`, `Byte`, `Character` and `Short` just duplicate the contents of utility methods in implementations of `Object.toString()`.

Yet another issue is a tiny discrepancy in implementation related to `Byte` and `Short` (see the first):

public static String toString(byte b) {
    return Integer.toString((int)b, 10);
}

public String toString() {
    return Integer.toString((int)value);
}

Unlike in overriden method, In utility one they explicitly specify radix which can be skipped, as implementation of `Integer.toString(int,int)` has a fast-path for radix 10, ending in `Integer.toString(int)`. This simplification gives tiny improvement, see benchmark:

@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Fork(jvmArgsAppend = {"-Xms2g", "-Xmx2g"})
public class ByteToStringBenchmark {
    @Benchmark
    public String byteToString() {
        return Byte.toString((byte) 1);
    }
}

Results:

before

Benchmark                                                            Mode  Cnt     Score     Error   Units
ByteToStringBenchmark.byteToString                                   avgt   30    11,648 ±   1,906   ns/op
ByteToStringBenchmark.byteToString:·gc.alloc.rate                    avgt   30  3288,576 ± 418,119  MB/sec
ByteToStringBenchmark.byteToString:·gc.alloc.rate.norm               avgt   30    48,001 ±   0,001    B/op
ByteToStringBenchmark.byteToString:·gc.churn.G1_Eden_Space           avgt   30  3301,804 ± 455,932  MB/sec
ByteToStringBenchmark.byteToString:·gc.churn.G1_Eden_Space.norm      avgt   30    48,158 ±   2,085    B/op
ByteToStringBenchmark.byteToString:·gc.churn.G1_Survivor_Space       avgt   30     0,004 ±   0,001  MB/sec
ByteToStringBenchmark.byteToString:·gc.churn.G1_Survivor_Space.norm  avgt   30    ≈ 10⁻⁴              B/op
ByteToStringBenchmark.byteToString:·gc.count                         avgt   30   202,000            counts
ByteToStringBenchmark.byteToString:·gc.time                          avgt   30   413,000                ms

after

Benchmark                                                            Mode  Cnt     Score     Error   Units
ByteToStringBenchmark.byteToString                                   avgt   30    10,016 ±   0,530   ns/op
ByteToStringBenchmark.byteToString:·gc.alloc.rate                    avgt   30  3673,700 ± 167,450  MB/sec
ByteToStringBenchmark.byteToString:·gc.alloc.rate.norm               avgt   30    48,001 ±   0,001    B/op
ByteToStringBenchmark.byteToString:·gc.churn.G1_Eden_Space           avgt   30  3662,406 ± 205,978  MB/sec
ByteToStringBenchmark.byteToString:·gc.churn.G1_Eden_Space.norm      avgt   30    47,870 ±   1,750    B/op
ByteToStringBenchmark.byteToString:·gc.churn.G1_Survivor_Space       avgt   30     0,004 ±   0,002  MB/sec
ByteToStringBenchmark.byteToString:·gc.churn.G1_Survivor_Space.norm  avgt   30    ≈ 10⁻⁴              B/op
ByteToStringBenchmark.byteToString:·gc.count                         avgt   30   224,000            counts
ByteToStringBenchmark.byteToString:·gc.time                          avgt   30   358,000                ms

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

Commit messages:
 - 8269665: Clean-up toString() methods of some primitive wrappers

Changes: https://git.openjdk.java.net/jdk/pull/4633/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=4633&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8269665
  Stats: 10 lines in 4 files changed: 4 ins; 0 del; 6 mod
  Patch: https://git.openjdk.java.net/jdk/pull/4633.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/4633/head:pull/4633

PR: https://git.openjdk.java.net/jdk/pull/4633


More information about the i18n-dev mailing list