From ab1c91b74181a0b4ff78b2462a1e47ec349a449f Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" <66972+wendigo@users.noreply.github.com> Date: Tue, 6 Aug 2024 09:39:04 +0200 Subject: [PATCH 1/3] Revert "Remove no longer needed optimization" This reverts commit 89cd8670117109834f3ee59a7d47843cb31abfd9. --- .../src/main/java/io/trino/util/JsonUtil.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java index ac6bcacd267f..2b448f073b4d 100644 --- a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java +++ b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java @@ -63,6 +63,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.StringReader; import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; @@ -105,6 +106,9 @@ public final class JsonUtil { + // StringReader outperforms InputStreamReader for small inputs. Limit based on Jackson benchmarks {@link https://github.com/FasterXML/jackson-benchmarks/pull/9} + private static final int STRING_READER_LENGTH_LIMIT = 8192; + private JsonUtil() {} // This object mapper is constructed without .configure(ORDER_MAP_ENTRIES_BY_KEYS, true) because @@ -123,6 +127,13 @@ public static JsonFactory createJsonFactory() public static JsonParser createJsonParser(JsonFactory factory, Slice json) throws IOException { + // Jackson tries to detect the character encoding automatically when using InputStream + // so we pass StringReader or an InputStreamReader instead. + if (json.length() < STRING_READER_LENGTH_LIMIT) { + // StringReader is more performant than InputStreamReader for small inputs + return factory.createParser(new StringReader(new String(json.getBytes(), UTF_8))); + } + return factory.createParser(new InputStreamReader(json.getInput(), UTF_8)); } From 47ca4f64ee526588a015a58d46617dd2c9914a29 Mon Sep 17 00:00:00 2001 From: James Petty Date: Mon, 5 Aug 2024 14:54:26 -0400 Subject: [PATCH 2/3] Remove redundant copy in JsonUtil --- core/trino-main/src/main/java/io/trino/util/JsonUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java index 2b448f073b4d..e35656c8c16e 100644 --- a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java +++ b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java @@ -131,7 +131,7 @@ public static JsonParser createJsonParser(JsonFactory factory, Slice json) // so we pass StringReader or an InputStreamReader instead. if (json.length() < STRING_READER_LENGTH_LIMIT) { // StringReader is more performant than InputStreamReader for small inputs - return factory.createParser(new StringReader(new String(json.getBytes(), UTF_8))); + return factory.createParser(new StringReader(json.toStringUtf8())); } return factory.createParser(new InputStreamReader(json.getInput(), UTF_8)); From b40f4e816c65a4b906cd467e6e23946e3e0f3de7 Mon Sep 17 00:00:00 2001 From: "Mateusz \"Serafin\" Gajewski" Date: Tue, 6 Aug 2024 10:47:19 +0200 Subject: [PATCH 3/3] Add clarifying comment to JsonUtil --- core/trino-main/src/main/java/io/trino/util/JsonUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java index e35656c8c16e..0c8ae3a1b521 100644 --- a/core/trino-main/src/main/java/io/trino/util/JsonUtil.java +++ b/core/trino-main/src/main/java/io/trino/util/JsonUtil.java @@ -129,6 +129,8 @@ public static JsonParser createJsonParser(JsonFactory factory, Slice json) { // Jackson tries to detect the character encoding automatically when using InputStream // so we pass StringReader or an InputStreamReader instead. + // Despite the https://github.com/FasterXML/jackson-core/pull/1081, the below performance optimization + // is still valid for small inputs. if (json.length() < STRING_READER_LENGTH_LIMIT) { // StringReader is more performant than InputStreamReader for small inputs return factory.createParser(new StringReader(json.toStringUtf8()));