From a9e4453b619990219bc0f6ca58a4c90f7a9dcf1c Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 11 Jan 2025 10:46:21 +0800 Subject: [PATCH] vector write --- .../jjb/ClientsWriteUTF8BytesTest.java | 2 +- .../alibaba/fastjson2/JSONWriterUTF16.java | 29 +++++++++++++++++-- .../com/alibaba/fastjson2/JSONWriterUTF8.java | 2 +- .../com/alibaba/fastjson2/util/IOUtils.java | 4 +++ .../fastjson2/JSONWriterUTF16Vector.java | 4 --- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/benchmark/src/test/java/com/alibaba/fastjson2/benchmark/jjb/ClientsWriteUTF8BytesTest.java b/benchmark/src/test/java/com/alibaba/fastjson2/benchmark/jjb/ClientsWriteUTF8BytesTest.java index 75967ee11e..f22ffa57ea 100644 --- a/benchmark/src/test/java/com/alibaba/fastjson2/benchmark/jjb/ClientsWriteUTF8BytesTest.java +++ b/benchmark/src/test/java/com/alibaba/fastjson2/benchmark/jjb/ClientsWriteUTF8BytesTest.java @@ -70,7 +70,7 @@ public static void fastjson2_str() { long millis = System.currentTimeMillis() - start; System.out.println("ClientsWriteUTF8Bytes-fastjson2 millis : " + millis); // zulu17.40.19 : - // zulu17.40.19_vec : 1139 1313 1307 + // zulu17.40.19_vec : 1139 1313 1307 1206 } } diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16.java b/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16.java index 9224f6d76d..49c44ab22b 100644 --- a/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16.java +++ b/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16.java @@ -20,6 +20,7 @@ import static com.alibaba.fastjson2.JSONFactory.*; import static com.alibaba.fastjson2.JSONWriter.Feature.*; +import static com.alibaba.fastjson2.JSONWriterUTF8.containsEscaped; import static com.alibaba.fastjson2.util.IOUtils.*; import static com.alibaba.fastjson2.util.JDKUtils.*; import static com.alibaba.fastjson2.util.TypeUtils.*; @@ -60,6 +61,7 @@ class JSONWriterUTF16 protected char[] chars; final CacheItem cacheItem; + protected final long byteVectorQuote; JSONWriterUTF16(Context ctx) { super(ctx, null, false, StandardCharsets.UTF_16); @@ -70,6 +72,7 @@ class JSONWriterUTF16 chars = new char[8192]; } this.chars = chars; + this.byteVectorQuote = this.useSingleQuote ? 0x2727_2727_2727_2727L : 0x2222_2222_2222_2222L; } public final void writeNull() { @@ -271,13 +274,29 @@ public void writeStringLatin1(byte[] value) { final char[] chars = this.chars; chars[off++] = quote; - for (byte c : value) { - if (c == '\\' || c == quote || c < ' ') { + int i = 0; + final long vecQuote = this.byteVectorQuote; + final int upperBound = (value.length - i) & ~7; + for (; i < upperBound; i += 8) { + long vec64 = getLongLittleEndian(value, i); + if (containsEscaped(vec64, vecQuote)) { escape = true; break; } + IOUtils.putLong(chars, off, expand(vec64)); + IOUtils.putLong(chars, off + 4, expand(vec64 >>> 32)); + off += 8; + } + if (!escape) { + for (; i < value.length; i++) { + byte c = value[i]; + if (c == '\\' || c == quote || c < ' ') { + escape = true; + break; + } - chars[off++] = (char) c; + chars[off++] = (char) c; + } } if (!escape) { @@ -290,6 +309,10 @@ public void writeStringLatin1(byte[] value) { writeStringEscape(value); } + static long expand(long i) { + return (i & 0xFFL) | ((i & 0xFF00L) << 8) | ((i & 0xFF0000L) << 16) | ((i & 0xFF000000L) << 24); + } + protected final void writeStringLatin1BrowserSecure(byte[] value) { boolean escape = false; int off = this.off; diff --git a/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF8.java b/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF8.java index 99f5f3302e..3b12b523bf 100644 --- a/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF8.java +++ b/core/src/main/java/com/alibaba/fastjson2/JSONWriterUTF8.java @@ -522,7 +522,7 @@ public void writeStringLatin1(byte[] value) { writeStringEscaped(value); } - private static boolean containsEscaped(long data, long quote) { + static boolean containsEscaped(long data, long quote) { // c == quote || c == '\\' || c < ' ' /* for (int i = 0; i < 8; ++i) { diff --git a/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java b/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java index 1d36da99f7..107ef77a56 100644 --- a/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java +++ b/core/src/main/java/com/alibaba/fastjson2/util/IOUtils.java @@ -1395,6 +1395,10 @@ public static int writeInt32(final char[] buf, int pos, final int value) { return pos + 6; } + public static void putChar(char[] buf, int pos, char v) { + UNSAFE.putChar(buf, ARRAY_CHAR_BASE_OFFSET + ((long) pos << 1), v); + } + public static void putShort(byte[] buf, int pos, short v) { UNSAFE.putShort( buf, diff --git a/incubator-vector/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16Vector.java b/incubator-vector/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16Vector.java index a24e098069..44b037f2ec 100644 --- a/incubator-vector/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16Vector.java +++ b/incubator-vector/src/main/java/com/alibaba/fastjson2/JSONWriterUTF16Vector.java @@ -19,10 +19,6 @@ final class JSONWriterUTF16Vector static final Vector V_BYTE_64_SLASH = ByteVector.SPECIES_64.broadcast('\\'); static final Vector V_BYTE_64_DOUBLE_QUOTE = ByteVector.SPECIES_64.broadcast('"'); static final Vector V_BYTE_64_SINGLE_QUOTE = ByteVector.SPECIES_64.broadcast('\''); - static final Vector V_BYTE_64_LT = ByteVector.SPECIES_64.broadcast('<'); - static final Vector V_BYTE_64_GT = ByteVector.SPECIES_64.broadcast('>'); - static final Vector V_BYTE_64_LB = ByteVector.SPECIES_64.broadcast('('); - static final Vector V_BYTE_64_RB = ByteVector.SPECIES_64.broadcast(')'); static final Vector V_SHORT_128_SLASH = ShortVector.SPECIES_128.broadcast('\\'); static final Vector V_SHORT_128_DOUBLE_QUOTE = ShortVector.SPECIES_128.broadcast('"');