From 5d7f8bf3226eb6965ae19eb0ad3bd1fb6fa88216 Mon Sep 17 00:00:00 2001 From: salyh Date: Sun, 13 Jul 2014 12:14:10 +0200 Subject: [PATCH 19/20] speedup number conversion if its an integral number gt 9 Signed-off-by: salyh --- .../apache/fleece/core/JsonBaseStreamParser.java | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/fleece-core/src/main/java/org/apache/fleece/core/JsonBaseStreamParser.java b/fleece-core/src/main/java/org/apache/fleece/core/JsonBaseStreamParser.java index 4a815ab..9d69db8 100644 --- a/fleece-core/src/main/java/org/apache/fleece/core/JsonBaseStreamParser.java +++ b/fleece-core/src/main/java/org/apache/fleece/core/JsonBaseStreamParser.java @@ -21,6 +21,7 @@ package org.apache.fleece.core; import javax.json.JsonException; import javax.json.stream.JsonLocation; import javax.json.stream.JsonParsingException; + import java.io.IOException; import java.math.BigDecimal; import java.util.NoSuchElementException; @@ -775,6 +776,10 @@ public abstract class JsonBaseStreamParser implements JsonChars, return currentIntegralNumber.intValue(); } + if(isCurrentNumberIntegral) { + return (int) parseLongFromChars(currentValue, 0, valueLength); + } + return getBigDecimal().intValue(); } @@ -788,6 +793,10 @@ public abstract class JsonBaseStreamParser implements JsonChars, return currentIntegralNumber.intValue(); } // int is ok, its only from 0-9 + if(isCurrentNumberIntegral) { + return parseLongFromChars(currentValue, 0, valueLength); + } + return getBigDecimal().longValue(); } @@ -824,5 +833,30 @@ public abstract class JsonBaseStreamParser implements JsonChars, public String getEscapedString() { return Strings.escape(getValue()); } + + private static long parseLongFromChars(char[] chars, int start, int end) { + + if (chars == null + || chars.length == 0 + || start < 0 + || end <= start + || end > chars.length - 1 + || start > chars.length - 1) { + throw new IllegalArgumentException(); + } + + long retVal = 0; + boolean negative = chars[start] == MINUS; + for (int i = negative ? start + 1 : start; i < end; i++) { + + //int this context we know its an integral number, so skip this due to perf reasons + /*if (chars[i] < ZERO || chars[i] > NINE) { + throw new IllegalArgumentException("Not a integral number"); + }*/ + retVal = retVal * 10 + (chars[i] - ZERO); + } + + return negative ? -retVal : retVal; + } } \ No newline at end of file -- 1.8.5.2 (Apple Git-48)