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 <[email protected]>
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();
}