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();
     }

Reply via email to