提交 2bd96e9f 编写于 作者: S shaojin.wensj

improved large object deserialize performance

上级 604f38f0
...@@ -32,6 +32,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -32,6 +32,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
private ConcurrentMap<String, Object> extraFieldDeserializers; private ConcurrentMap<String, Object> extraFieldDeserializers;
private final Map<String, FieldDeserializer> alterNameFieldDeserializers; private final Map<String, FieldDeserializer> alterNameFieldDeserializers;
private Map<String, FieldDeserializer> fieldDeserializerMap;
private transient long[] smartMatchHashArray; private transient long[] smartMatchHashArray;
private transient short[] smartMatchHashArrayMapping; private transient short[] smartMatchHashArrayMapping;
...@@ -61,6 +62,13 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -61,6 +62,13 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
sortedFieldDeserializers[i] = fieldDeserializer; sortedFieldDeserializers[i] = fieldDeserializer;
if (size > 128) {
if (fieldDeserializerMap == null) {
fieldDeserializerMap = new HashMap<String, FieldDeserializer>();
}
fieldDeserializerMap.put(fieldInfo.name, fieldDeserializer);
}
for (String name : fieldInfo.alternateNames) { for (String name : fieldInfo.alternateNames) {
if (alterNameFieldDeserializers == null) { if (alterNameFieldDeserializers == null) {
alterNameFieldDeserializers = new HashMap<String, FieldDeserializer>(); alterNameFieldDeserializers = new HashMap<String, FieldDeserializer>();
...@@ -86,6 +94,13 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -86,6 +94,13 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
if (key == null) { if (key == null) {
return null; return null;
} }
if (fieldDeserializerMap != null) {
FieldDeserializer fieldDeserializer = fieldDeserializerMap.get(key);
if (fieldDeserializer != null) {
return fieldDeserializer;
}
}
int low = 0; int low = 0;
int high = sortedFieldDeserializers.length - 1; int high = sortedFieldDeserializers.length - 1;
...@@ -479,14 +494,14 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -479,14 +494,14 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
} }
String typeKey = beanInfo.typeKey; String typeKey = beanInfo.typeKey;
for (int fieldIndex = 0;; fieldIndex++) { for (int fieldIndex = 0, notMatchCount = 0;; fieldIndex++) {
String key = null; String key = null;
FieldDeserializer fieldDeser = null; FieldDeserializer fieldDeser = null;
FieldInfo fieldInfo = null; FieldInfo fieldInfo = null;
Class<?> fieldClass = null; Class<?> fieldClass = null;
JSONField feildAnnotation = null; JSONField feildAnnotation = null;
boolean customDeserilizer = false; boolean customDeserilizer = false;
if (fieldIndex < sortedFieldDeserializers.length) { if (fieldIndex < sortedFieldDeserializers.length && notMatchCount < 16) {
fieldDeser = sortedFieldDeserializers[fieldIndex]; fieldDeser = sortedFieldDeserializers[fieldIndex];
fieldInfo = fieldDeser.fieldInfo; fieldInfo = fieldDeser.fieldInfo;
fieldClass = fieldInfo.fieldClass; fieldClass = fieldInfo.fieldClass;
...@@ -516,7 +531,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -516,7 +531,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass == long.class || fieldClass == Long.class) { } else if (fieldClass == long.class || fieldClass == Long.class) {
long longVal = lexer.scanFieldLong(name_chars); long longVal = lexer.scanFieldLong(name_chars);
...@@ -530,7 +546,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -530,7 +546,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass == String.class) { } else if (fieldClass == String.class) {
fieldValue = lexer.scanFieldString(name_chars); fieldValue = lexer.scanFieldString(name_chars);
...@@ -539,7 +556,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -539,7 +556,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass == java.util.Date.class && fieldInfo.format == null) { } else if (fieldClass == java.util.Date.class && fieldInfo.format == null) {
fieldValue = lexer.scanFieldDate(name_chars); fieldValue = lexer.scanFieldDate(name_chars);
...@@ -548,6 +566,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -548,6 +566,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (fieldClass == BigDecimal.class) { } else if (fieldClass == BigDecimal.class) {
...@@ -557,6 +576,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -557,6 +576,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (fieldClass == BigInteger.class) { } else if (fieldClass == BigInteger.class) {
...@@ -566,6 +586,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -566,6 +586,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (fieldClass == boolean.class || fieldClass == Boolean.class) { } else if (fieldClass == boolean.class || fieldClass == Boolean.class) {
...@@ -581,7 +602,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -581,7 +602,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass == float.class || fieldClass == Float.class) { } else if (fieldClass == float.class || fieldClass == Float.class) {
float floatVal = lexer.scanFieldFloat(name_chars); float floatVal = lexer.scanFieldFloat(name_chars);
...@@ -595,7 +617,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -595,7 +617,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass == double.class || fieldClass == Double.class) { } else if (fieldClass == double.class || fieldClass == Double.class) {
double doubleVal = lexer.scanFieldDouble(name_chars); double doubleVal = lexer.scanFieldDouble(name_chars);
...@@ -609,7 +632,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -609,7 +632,8 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
continue; notMatchCount++;
continue;
} }
} else if (fieldClass.isEnum() // } else if (fieldClass.isEnum() //
&& parser.getConfig().getDeserializer(fieldClass) instanceof EnumDeserializer && parser.getConfig().getDeserializer(fieldClass) instanceof EnumDeserializer
...@@ -623,6 +647,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -623,6 +647,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} }
...@@ -633,6 +658,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -633,6 +658,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (fieldClass == float[].class) { } else if (fieldClass == float[].class) {
...@@ -642,6 +668,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -642,6 +668,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (fieldClass == float[][].class) { } else if (fieldClass == float[][].class) {
...@@ -651,6 +678,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer { ...@@ -651,6 +678,7 @@ public class JavaBeanDeserializer implements ObjectDeserializer {
matchField = true; matchField = true;
valueParsed = true; valueParsed = true;
} else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) { } else if (lexer.matchStat == JSONLexer.NOT_MATCH_NAME) {
notMatchCount++;
continue; continue;
} }
} else if (lexer.matchField(name_chars)) { } else if (lexer.matchField(name_chars)) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册