This is an automated email from the ASF dual-hosted git repository. struberg pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/johnzon.git
The following commit(s) were added to refs/heads/master by this push: new 6474c96 various small performance improvenemts 6474c96 is described below commit 6474c9697d1c81659baddef421dbfbb9fd161635 Author: Mark Struberg <strub...@apache.org> AuthorDate: Sun Jan 31 23:03:29 2021 +0100 various small performance improvenemts * start with bigger buffers * bufferLeft to avoid recalculation every time --- .../org/apache/johnzon/core/JsonArrayImpl.java | 2 +- .../org/apache/johnzon/core/JsonObjectImpl.java | 2 +- .../apache/johnzon/core/JsonStreamParserImpl.java | 27 ++++++++++++++++------ .../java/org/apache/johnzon/mapper/Mapper.java | 6 ++--- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java index d05cfbf..7088bfd 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonArrayImpl.java @@ -166,7 +166,7 @@ class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray, Serial if (unmodifieableBackingList.isEmpty()) { return "[]"; } - final StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(2048); try (final JsonGenerator generator = new JsonGeneratorImpl(writer, provider, false)) { generator.writeStartArray(); unmodifieableBackingList.forEach(generator::write); diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java index 4e45f08..f593327 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonObjectImpl.java @@ -146,7 +146,7 @@ final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements Jso if (unmodifieableBackingMap.isEmpty()) { return "{}"; } - final StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(2048); try (final JsonGenerator generator = new JsonGeneratorImpl(writer, provider, false)) { generator.writeStartObject(); unmodifieableBackingMap.forEach(generator::write); diff --git a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java index 3e75b5c..8f2edb6 100644 --- a/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java +++ b/johnzon-core/src/main/java/org/apache/johnzon/core/JsonStreamParserImpl.java @@ -42,6 +42,9 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //-1 would cause a re-read of the first character in the buffer (which is at zero index) private int bufferPos = Integer.MIN_VALUE; + // performance optimisation to avoid subtraction on readNextChar + private int bufferLeft = 0; + //available character in the buffer. It might be <= "buffer.length". private int availableCharsInBuffer; @@ -220,7 +223,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC previousEvent != VALUE_NULL && previousEvent != VALUE_NUMBER) { if (bufferPos < 0) { // check we don't have an empty string to parse final char c = readNextChar(); - bufferPos--; + unreadChar(); return c != EOF; } return true; @@ -289,7 +292,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //refill is necessary copy the already read value part into the value buffer protected final char readNextChar() { - if ((availableCharsInBuffer - bufferPos) <= 1) { + if (bufferLeft == 0) { //fillbuffer //copy content from old buffer to valuebuffer @@ -317,6 +320,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC } bufferPos = 0; + bufferLeft = availableCharsInBuffer - bufferPos - 1; //end fillbuffer } else { @@ -327,6 +331,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //} bufferPos++; + bufferLeft--; } return buffer[bufferPos]; @@ -370,13 +375,18 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC : null; } + private void unreadChar() { + bufferPos--; + bufferLeft++; + } + @Override protected final Event internalNext() { //main entry, make decision how to handle the current character in the stream if (!hasNext()) { final char c = readNextChar(); - bufferPos--; + unreadChar(); if (c != EOF) { throw uexc("No available event"); } @@ -657,7 +667,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //current n is one of < '\u001F' -OR- ESCAPE_CHAR -OR- EOL -OR- QUOTE - bufferPos--; //unread one char + unreadChar(); //unread one char } } while (true); @@ -686,8 +696,11 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC //always the beginning quote of a key or value //last event must one of the following-> : { [ , - if (previousEvent != -1 && (previousEvent != KEY_SEPARATOR_EVENT && previousEvent != START_OBJECT && previousEvent != START_ARRAY - && previousEvent != COMMA_EVENT)) { + if (previousEvent != -1 && + (previousEvent != KEY_SEPARATOR_EVENT && + previousEvent != START_OBJECT && + previousEvent != START_ARRAY && + previousEvent != COMMA_EVENT)) { throw uexc("Expected : { [ ,"); } //starting quote already consumed @@ -792,7 +805,7 @@ public class JsonStreamParserImpl extends JohnzonJsonParserImpl implements JsonC if (y == COMMA_CHAR || y == END_ARRAY_CHAR || y == END_OBJECT_CHAR || y == EOL || y == SPACE || y == TAB || y == CR || y == EOF) { - bufferPos--;//unread one char + unreadChar();//unread one char //['-', DIGIT] if (isCurrentNumberIntegral && c == MINUS && cumulatedDigitValue >= 48 && cumulatedDigitValue <= 57) { diff --git a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java index 3e7aaf7..7d24e23 100644 --- a/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java +++ b/johnzon-mapper/src/main/java/org/apache/johnzon/mapper/Mapper.java @@ -223,19 +223,19 @@ public class Mapper implements Closeable { } public String writeArrayAsString(final Collection<?> instance) { - final StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(2048); writeArray(instance, writer); return writer.toString(); } public <T> String writeArrayAsString(final T[] instance) { - final StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(2048); writeArray(instance, writer); return writer.toString(); } public String writeObjectAsString(final Object instance) { - final StringWriter writer = new StringWriter(); + final StringWriter writer = new StringWriter(2048); writeObject(instance, writer); return writer.toString(); }