diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-09-28 14:10:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-28 14:10:22 +0200 |
commit | b43ea4e607b1dc380f262c8d65b30226db481fba (patch) | |
tree | b75e4f8754084aa183ad78f760dc2114ea425ab9 | |
parent | daff9cf69012cb5ebaa85b900b3353b2060c1fcd (diff) | |
parent | 449011cbad0de74da5f2dbee42307fc7fbfd07d2 (diff) |
Merge pull request #19318 from vespa-engine/balder/use-bufferedoutput-over-expensive-bytearrayoutputstream
Use the faster BufferOutput over ByteArrayOutputStream that is synchr…
3 files changed, 30 insertions, 25 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java index d0c08d2747d..fd27dedf041 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/provision/ProvisionerAdapter.java @@ -10,7 +10,8 @@ import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.ProvisionLogger; import com.yahoo.config.provision.Provisioner; -import java.util.*; +import java.util.List; + /** * A wrapper for {@link Provisioner} to avoid having to expose multitenant diff --git a/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java b/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java index 0fabea77df0..4c76abd4707 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java +++ b/vespajlib/src/main/java/com/yahoo/slime/BufferedOutput.java @@ -3,6 +3,8 @@ package com.yahoo.slime; import com.yahoo.compress.Compressor; +import java.nio.charset.Charset; + final class BufferedOutput { private byte[] buf; @@ -56,6 +58,9 @@ final class BufferedOutput { System.arraycopy(buf, 0, ret, 0, pos); return ret; } + public String toString(Charset charset) { + return new String(buf, 0, pos, charset); + } Compressor.Compression compress(Compressor compressor) { return compressor.compress(buf, pos); } diff --git a/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java b/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java index b7f11f53cd5..682eccdab42 100644 --- a/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java +++ b/vespajlib/src/main/java/com/yahoo/slime/JsonDecoder.java @@ -2,10 +2,9 @@ package com.yahoo.slime; import com.yahoo.text.Text; -import com.yahoo.text.Utf8; -import java.io.ByteArrayOutputStream; import java.nio.ByteBuffer; +import java.nio.charset.StandardCharsets; /** * A port of the C++ json decoder intended to be fast. @@ -20,7 +19,7 @@ public class JsonDecoder { private final SlimeInserter slimeInserter = new SlimeInserter(null); private final ArrayInserter arrayInserter = new ArrayInserter(null); private final ObjectInserter objectInserter = new ObjectInserter(null, null); - private final ByteArrayOutputStream buf = new ByteArrayOutputStream(); + private final BufferedOutput buf = new BufferedOutput(); private static final byte[] TRUE = {'t', 'r', 'u', 'e'}; private static final byte[] FALSE = {'f', 'a', 'l', 's', 'e'}; @@ -86,15 +85,15 @@ public class JsonDecoder { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '+': case '-': - buf.write(c); + buf.put(c); next(); break; default: if (likelyFloatingPoint) { - double num = Double.parseDouble(Utf8.toString(buf.toByteArray())); + double num = Double.parseDouble(buf.toString(StandardCharsets.UTF_8)); inserter.insertDOUBLE(num); } else { - long num = Long.parseLong(Utf8.toString(buf.toByteArray())); + long num = Long.parseLong(buf.toString(StandardCharsets.UTF_8)); inserter.insertLONG(num); } return; @@ -103,8 +102,8 @@ public class JsonDecoder { } private void expect(byte[] expected) { - for (int i = 0; i < expected.length; i++) { - if ( ! skip(expected[i])) { + for (byte b : expected) { + if ( ! skip(b)) { in.fail("Unexpected " + characterToReadableString(c)); return; } @@ -150,9 +149,9 @@ public class JsonDecoder { default: for (;;) { switch (c) { - case ':': case ' ': case '\t': case '\n': case '\r': case '\0': return Utf8.toString(buf.toByteArray()); + case ':': case ' ': case '\t': case '\n': case '\r': case '\0': return buf.toString(StandardCharsets.UTF_8); default: - buf.write(c); + buf.put(c); next(); break; } @@ -176,13 +175,13 @@ public class JsonDecoder { next(); switch (c) { case '"': case '\\': case '/': case '\'': - buf.write(c); + buf.put(c); break; - case 'b': buf.write((byte) '\b'); break; - case 'f': buf.write((byte) '\f'); break; - case 'n': buf.write((byte) '\n'); break; - case 'r': buf.write((byte) '\r'); break; - case 't': buf.write((byte) '\t'); break; + case 'b': buf.put((byte) '\b'); break; + case 'f': buf.put((byte) '\f'); break; + case 'n': buf.put((byte) '\n'); break; + case 'r': buf.put((byte) '\r'); break; + case 't': buf.put((byte) '\t'); break; case 'u': writeUtf8(dequoteUtf16(), buf, 0xffffff80); continue; default: in.fail("Invalid quoted char(" + c + ")"); @@ -193,34 +192,34 @@ public class JsonDecoder { case '"': case '\'': if (c == quote) { next(); - return Utf8.toString(buf.toByteArray()); + return buf.toString(StandardCharsets.UTF_8); } else { - buf.write(c); + buf.put(c); next(); } break; case '\0': in.fail("Unterminated string"); - return Utf8.toString(buf.toByteArray()); + return buf.toString(StandardCharsets.UTF_8); default: - buf.write(c); + buf.put(c); next(); break; } } } - private static void writeUtf8(long codepoint, ByteArrayOutputStream buf, long mask) { + private static void writeUtf8(long codepoint, BufferedOutput buf, long mask) { if ((codepoint & mask) == 0) { - buf.write((byte) ((mask << 1) | codepoint)); + buf.put((byte) ((mask << 1) | codepoint)); } else { writeUtf8(codepoint >> 6, buf, mask >> (2 - ((mask >> 6) & 0x1))); - buf.write((byte) (0x80 | (codepoint & 0x3f))); + buf.put((byte) (0x80 | (codepoint & 0x3f))); } } - private static byte[] unicodeStart = {'\\', 'u'}; + private final static byte[] unicodeStart = {'\\', 'u'}; private long dequoteUtf16() { next(); long codepoint = readHexValue(4); |