Skip to content

Commit d7a8180

Browse files
committed
Improve performance of json functions
Avoid allocating heap ByteBuffer used by InputStreamReader.
1 parent 7190f20 commit d7a8180

File tree

1 file changed

+10
-1
lines changed

1 file changed

+10
-1
lines changed

core/trino-main/src/main/java/io/trino/util/JsonUtil.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@
6363
import java.io.IOException;
6464
import java.io.InputStreamReader;
6565
import java.io.OutputStream;
66+
import java.io.StringReader;
6667
import java.math.BigDecimal;
6768
import java.util.ArrayList;
6869
import java.util.HashMap;
@@ -105,6 +106,9 @@
105106

106107
public final class JsonUtil
107108
{
109+
// StringReader outperforms InputStreamReader for small inputs. Limit based on Jackson benchmarks {@link https://github.com/FasterXML/jackson-benchmarks/pull/9}
110+
private static final int STRING_READER_LENGTH_LIMIT = 8192;
111+
108112
private JsonUtil() {}
109113

110114
// This object mapper is constructed without .configure(ORDER_MAP_ENTRIES_BY_KEYS, true) because
@@ -124,7 +128,12 @@ public static JsonParser createJsonParser(JsonFactory factory, Slice json)
124128
throws IOException
125129
{
126130
// Jackson tries to detect the character encoding automatically when using InputStream
127-
// so we pass an InputStreamReader instead.
131+
// so we pass StringReader or an InputStreamReader instead.
132+
if (json.length() < STRING_READER_LENGTH_LIMIT) {
133+
// StringReader is more performant than InputStreamReader for small inputs
134+
return factory.createParser(new StringReader(new String(json.getBytes(), UTF_8)));
135+
}
136+
128137
return factory.createParser(new InputStreamReader(json.getInput(), UTF_8));
129138
}
130139

0 commit comments

Comments
 (0)