From 30373b81fddbf7e82340e466cf6425a5252399d2 Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Fri, 7 Jun 2024 15:34:37 +0800 Subject: [PATCH 1/8] optimization for UUID toString --- .../share/classes/java/util/UUID.java | 41 ++++++------------- .../classes/jdk/internal/util/HexDigits.java | 27 +++++------- 2 files changed, 23 insertions(+), 45 deletions(-) diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java index a82f523a66ffa..eef2cc83a10a9 100644 --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -31,7 +31,6 @@ import jdk.internal.access.JavaLangAccess; import jdk.internal.access.SharedSecrets; -import jdk.internal.util.ByteArrayLittleEndian; import jdk.internal.util.HexDigits; /** @@ -467,38 +466,24 @@ public long node() { */ @Override public String toString() { - long lsb = leastSigBits; - long msb = mostSigBits; + int i0 = (int) (mostSigBits >> 32); + int i1 = (int) mostSigBits; + int i2 = (int) (leastSigBits >> 32); + int i3 = (int) leastSigBits; + byte[] buf = new byte[36]; - ByteArrayLittleEndian.setLong( - buf, - 0, - HexDigits.packDigits((int) (msb >> 56), (int) (msb >> 48), (int) (msb >> 40), (int) (msb >> 32))); + HexDigits.putHex(buf, 0, i0 >> 16); + HexDigits.putHex(buf, 4, i0); buf[8] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 9, - HexDigits.packDigits(((int) msb) >> 24, ((int) msb) >> 16)); + HexDigits.putHex(buf, 9, i1 >> 16); buf[13] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 14, - HexDigits.packDigits(((int) msb) >> 8, (int) msb)); + HexDigits.putHex(buf, 14, i1); buf[18] = '-'; - ByteArrayLittleEndian.setInt( - buf, - 19, - HexDigits.packDigits((int) (lsb >> 56), (int) (lsb >> 48))); + HexDigits.putHex(buf, 19, i2 >> 16); buf[23] = '-'; - ByteArrayLittleEndian.setLong( - buf, - 24, - HexDigits.packDigits((int) (lsb >> 40), (int) (lsb >> 32), ((int) lsb) >> 24, ((int) lsb) >> 16)); - ByteArrayLittleEndian.setInt( - buf, - 32, - HexDigits.packDigits(((int) lsb) >> 8, (int) lsb)); - + HexDigits.putHex(buf, 24, i2); + HexDigits.putHex(buf, 28, i3 >> 16); + HexDigits.putHex(buf, 32, i3); try { return jla.newStringNoRepl(buf, StandardCharsets.ISO_8859_1); } catch (CharacterCodingException cce) { diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index 075443571e198..9b41e281a2a01 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -114,24 +114,17 @@ public static short digitPair(int i, boolean ucase) { } /** - * Return a little-endian packed integer for the 4 ASCII bytes for an input unsigned 2-byte integer. - * {@code b0} is the most significant byte and {@code b1} is the least significant byte. - * The integer is passed byte-wise to allow reordering of execution. + * Insert the int into the buffer as 4 hexadecimal digits + * @param buffer byte buffer to copy into + * @param off insert point + * @param value to convert */ - public static int packDigits(int b0, int b1) { - return DIGITS[b0 & 0xff] | (DIGITS[b1 & 0xff] << 16); - } - - /** - * Return a little-endian packed long for the 8 ASCII bytes for an input unsigned 4-byte integer. - * {@code b0} is the most significant byte and {@code b3} is the least significant byte. - * The integer is passed byte-wise to allow reordering of execution. - */ - public static long packDigits(int b0, int b1, int b2, int b3) { - return DIGITS[b0 & 0xff] - | (DIGITS[b1 & 0xff] << 16) - | (((long) DIGITS[b2 & 0xff]) << 32) - | (((long) DIGITS[b3 & 0xff]) << 48); + public static void putHex(byte[] buffer, int off, int i) { + int v = (DIGITS[i & 0xff] << 16) | DIGITS[(i >> 8) & 0xff]; + buffer[off] = (byte) v; + buffer[off + 1] = (byte) (v >> 8); + buffer[off + 2] = (byte) (v >> 16); + buffer[off + 3] = (byte) (v >> 24); } /** From ace7a9f6f7652ffd2257c71c342e6d569528df8f Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Sat, 8 Jun 2024 14:36:58 +0800 Subject: [PATCH 2/8] add comments --- src/java.base/share/classes/jdk/internal/util/HexDigits.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index 9b41e281a2a01..a0a5c3eb5ed54 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -120,6 +120,7 @@ public static short digitPair(int i, boolean ucase) { * @param value to convert */ public static void putHex(byte[] buffer, int off, int i) { + // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes int v = (DIGITS[i & 0xff] << 16) | DIGITS[(i >> 8) & 0xff]; buffer[off] = (byte) v; buffer[off + 1] = (byte) (v >> 8); From d6b4ed2505c5d6926263b551c2586737ad839625 Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Sun, 9 Jun 2024 07:17:53 +0800 Subject: [PATCH 3/8] change method name, putHex -> putHex4, and fix comments --- src/java.base/share/classes/java/util/UUID.java | 16 ++++++++-------- .../classes/jdk/internal/util/HexDigits.java | 7 ++++--- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java index eef2cc83a10a9..0bf2487ae7f90 100644 --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -472,18 +472,18 @@ public String toString() { int i3 = (int) leastSigBits; byte[] buf = new byte[36]; - HexDigits.putHex(buf, 0, i0 >> 16); - HexDigits.putHex(buf, 4, i0); + HexDigits.putHex4(buf, 0, i0 >> 16); + HexDigits.putHex4(buf, 4, i0); buf[8] = '-'; - HexDigits.putHex(buf, 9, i1 >> 16); + HexDigits.putHex4(buf, 9, i1 >> 16); buf[13] = '-'; - HexDigits.putHex(buf, 14, i1); + HexDigits.putHex4(buf, 14, i1); buf[18] = '-'; - HexDigits.putHex(buf, 19, i2 >> 16); + HexDigits.putHex4(buf, 19, i2 >> 16); buf[23] = '-'; - HexDigits.putHex(buf, 24, i2); - HexDigits.putHex(buf, 28, i3 >> 16); - HexDigits.putHex(buf, 32, i3); + HexDigits.putHex4(buf, 24, i2); + HexDigits.putHex4(buf, 28, i3 >> 16); + HexDigits.putHex4(buf, 32, i3); try { return jla.newStringNoRepl(buf, StandardCharsets.ISO_8859_1); } catch (CharacterCodingException cce) { diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index a0a5c3eb5ed54..ef1d7d8a89035 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -114,12 +114,13 @@ public static short digitPair(int i, boolean ucase) { } /** - * Insert the int into the buffer as 4 hexadecimal digits + * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes, + * {@code i} only least significant 16 bits are used. * @param buffer byte buffer to copy into * @param off insert point - * @param value to convert + * @param i to convert */ - public static void putHex(byte[] buffer, int off, int i) { + public static void putHex4(byte[] buffer, int off, int i) { // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes int v = (DIGITS[i & 0xff] << 16) | DIGITS[(i >> 8) & 0xff]; buffer[off] = (byte) v; From 7628536f7d2938a2db13fc168b8312a53c4faa42 Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Sun, 9 Jun 2024 15:12:36 +0800 Subject: [PATCH 4/8] Update src/java.base/share/classes/jdk/internal/util/HexDigits.java Co-authored-by: Chen Liang --- src/java.base/share/classes/jdk/internal/util/HexDigits.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index ef1d7d8a89035..ad6e3775b6b52 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -115,7 +115,7 @@ public static short digitPair(int i, boolean ucase) { /** * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes, - * {@code i} only least significant 16 bits are used. + * only least significant 16 bits of {@code i} are used. * @param buffer byte buffer to copy into * @param off insert point * @param i to convert From ea1c4eba1830e5bf9a6edc573c9d8beb09a641bf Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Sun, 9 Jun 2024 15:14:00 +0800 Subject: [PATCH 5/8] update copy right year --- src/java.base/share/classes/java/util/UUID.java | 2 +- src/java.base/share/classes/jdk/internal/util/HexDigits.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java index 0bf2487ae7f90..bc0c741f5c206 100644 --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index ad6e3775b6b52..f3a346268ac8c 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it From 5696288f9ccd41c3d57b86a4fd6599fc27f9c117 Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Sun, 9 Jun 2024 15:18:54 +0800 Subject: [PATCH 6/8] rename putHex4 to put4 --- src/java.base/share/classes/java/util/UUID.java | 16 ++++++++-------- .../classes/jdk/internal/util/HexDigits.java | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/java.base/share/classes/java/util/UUID.java b/src/java.base/share/classes/java/util/UUID.java index bc0c741f5c206..e334f7263e46f 100644 --- a/src/java.base/share/classes/java/util/UUID.java +++ b/src/java.base/share/classes/java/util/UUID.java @@ -472,18 +472,18 @@ public String toString() { int i3 = (int) leastSigBits; byte[] buf = new byte[36]; - HexDigits.putHex4(buf, 0, i0 >> 16); - HexDigits.putHex4(buf, 4, i0); + HexDigits.put4(buf, 0, i0 >> 16); + HexDigits.put4(buf, 4, i0); buf[8] = '-'; - HexDigits.putHex4(buf, 9, i1 >> 16); + HexDigits.put4(buf, 9, i1 >> 16); buf[13] = '-'; - HexDigits.putHex4(buf, 14, i1); + HexDigits.put4(buf, 14, i1); buf[18] = '-'; - HexDigits.putHex4(buf, 19, i2 >> 16); + HexDigits.put4(buf, 19, i2 >> 16); buf[23] = '-'; - HexDigits.putHex4(buf, 24, i2); - HexDigits.putHex4(buf, 28, i3 >> 16); - HexDigits.putHex4(buf, 32, i3); + HexDigits.put4(buf, 24, i2); + HexDigits.put4(buf, 28, i3 >> 16); + HexDigits.put4(buf, 32, i3); try { return jla.newStringNoRepl(buf, StandardCharsets.ISO_8859_1); } catch (CharacterCodingException cce) { diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index f3a346268ac8c..4dbc382292268 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -120,7 +120,7 @@ public static short digitPair(int i, boolean ucase) { * @param off insert point * @param i to convert */ - public static void putHex4(byte[] buffer, int off, int i) { + public static void put4(byte[] buffer, int off, int i) { // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes int v = (DIGITS[i & 0xff] << 16) | DIGITS[(i >> 8) & 0xff]; buffer[off] = (byte) v; From 035a07ab7d4f679c914e5dd9089f769637d562be Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Mon, 10 Jun 2024 06:40:48 +0800 Subject: [PATCH 7/8] better parameter names --- .../classes/jdk/internal/util/HexDigits.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index 4dbc382292268..334bf198ddc5d 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -117,16 +117,16 @@ public static short digitPair(int i, boolean ucase) { * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes, * only least significant 16 bits of {@code i} are used. * @param buffer byte buffer to copy into - * @param off insert point - * @param i to convert + * @param index insert point + * @param value to convert */ - public static void put4(byte[] buffer, int off, int i) { + public static void put4(byte[] buffer, int index, int value) { // Prepare an int value so C2 generates a 4-byte write instead of two 2-byte writes - int v = (DIGITS[i & 0xff] << 16) | DIGITS[(i >> 8) & 0xff]; - buffer[off] = (byte) v; - buffer[off + 1] = (byte) (v >> 8); - buffer[off + 2] = (byte) (v >> 16); - buffer[off + 3] = (byte) (v >> 24); + int v = (DIGITS[value & 0xff] << 16) | DIGITS[(value >> 8) & 0xff]; + buffer[index] = (byte) v; + buffer[index + 1] = (byte) (v >> 8); + buffer[index + 2] = (byte) (v >> 16); + buffer[index + 3] = (byte) (v >> 24); } /** From 780abdf1000a2fdf51e18b30477b1fe7849d59ac Mon Sep 17 00:00:00 2001 From: Shaojin Wen Date: Mon, 10 Jun 2024 15:28:00 +0800 Subject: [PATCH 8/8] Update src/java.base/share/classes/jdk/internal/util/HexDigits.java Co-authored-by: Claes Redestad --- src/java.base/share/classes/jdk/internal/util/HexDigits.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/java.base/share/classes/jdk/internal/util/HexDigits.java b/src/java.base/share/classes/jdk/internal/util/HexDigits.java index 334bf198ddc5d..c08db4f5b48fd 100644 --- a/src/java.base/share/classes/jdk/internal/util/HexDigits.java +++ b/src/java.base/share/classes/jdk/internal/util/HexDigits.java @@ -115,7 +115,7 @@ public static short digitPair(int i, boolean ucase) { /** * Insert the unsigned 2-byte integer into the buffer as 4 hexadecimal digit ASCII bytes, - * only least significant 16 bits of {@code i} are used. + * only least significant 16 bits of {@code value} are used. * @param buffer byte buffer to copy into * @param index insert point * @param value to convert