测试环境:winXP、idea7.0.2、jvm1.5
测试本版:gson 1.6,jackson 1.7.3
主要测试Object2json的功能
测试代码:
-
-
int objNum = 1000 ;
-
System. out. println ( "test object number : " + objNum ) ;
-
List jsObjects = new ArrayList (objNum ) ;
-
for ( int i = 0 ; i < objNum ; i++ ) {
-
JsonObject jo = new JsonObject ( ) ;
-
jo. setPint ( 1000 ) ;
-
jo. setPstring ( "test string" ) ;
-
jo. setPlong (0L ) ;
-
jo. setPboolean ( false ) ;
-
jo. setPshort ( ( short ) 1 ) ;
-
jo. setPbyte ( ( byte ) 50 ) ;
-
jo. setPdate ( new Date ( ) ) ;
-
Map map = new HashMap ( ) ;
-
for ( int a = 0 ; a < 100 ; a++ ) {
-
map. put (i, i ) ;
-
}
-
List array = new ArrayList ( ) ;
-
for ( int a = 0 ; a < 100 ; a++ ) {
-
array. add (i ) ;
-
}
-
jo. setPlist (array ) ;
-
jo. setPmap (map ) ;
-
jsObjects. add (jo ) ;
-
}
-
-
Date gsonStart = new Date ( ) ;
-
Gson gs = new Gson ( ) ;
-
gs. toJson (jsObjects ) ;
-
Date gsonEnd = new Date ( ) ;
-
System. out. println ( "gson cost:" + (gsonEnd. getTime ( ) – gsonStart. getTime ( ) )+ "ms" ) ;
-
-
try {
-
Date jacksonStart = new Date ( ) ;
-
ObjectMapper mapper = new ObjectMapper ( ) ;
-
SerializationConfig sc = mapper. getSerializationConfig ( ) ;
-
sc. setDateFormat ( new SimpleDateFormat ( "yyyy-MM-dd hh:mm:ss" ) ) ;
-
mapper. setSerializationConfig (sc ) ;
-
mapper. writeValueAsString (jsObjects ) ;
-
Date jacksonEnd = new Date ( ) ;
-
System. out. println ( "jackson 1 cost:"
-
+ (jacksonEnd. getTime ( ) – jacksonStart. getTime ( ) )+ "ms" ) ;
-
} catch ( Exception e ) {
-
e. printStackTrace ( ) ;
-
}
-
-
try {
-
Date jacksonStart = new Date ( ) ;
-
ObjectMapper mapper = new ObjectMapper ( ) ;
-
SerializationConfig sc = mapper. getSerializationConfig ( ) ;
-
sc. setDateFormat ( new SimpleDateFormat ( "yyyy-MM-dd hh:mm:ss" ) ) ;
-
mapper. setSerializationConfig (sc ) ;
-
StringWriter sw = new StringWriter ( ) ;
-
JsonGenerator gen = new JsonFactory ( ). createJsonGenerator (sw ) ;
-
mapper. writeValue (gen, jsObjects ) ;
-
gen. close ( ) ;
-
sw. toString ( ) ;
-
Date jacksonEnd = new Date ( ) ;
-
System. out. println ( "jackson 2 cost:"
-
+ (jacksonEnd. getTime ( ) – jacksonStart. getTime ( ) )+ "ms" ) ;
-
} catch ( IOException e ) {
-
e. printStackTrace ( ) ;
-
}
jackson测试用了两种方式,一种直接生成string,另一种使用流来处理,以下分别用1和2来代替。
测试的Object包含了各种类型属性,测试成绩如下:
test object number : 100
gson cost:500ms
jackson 1 cost:625ms
jackson 2 cost:63ms
test object number : 1000
gson cost:1218ms
jackson 1 cost:813ms
jackson 2 cost:140ms
test object number : 5000
gson cost:3250ms
jackson 1 cost:1125ms
jackson 2 cost:281ms
test object number : 7000
gson cost:4297ms
jackson 1 cost:1250ms
jackson 2 cost:610ms
(公司机器太破了,2g内存,1w数据压不上去了,直接内存不够鸟)
可以看到在objNum为100的情况下gson要比jackson直接生成string的方式要快,但比jackson流方式差上8倍左右。随着objNum的增大gson已经开始比jackson的string方式慢,比流方式相差在8-12倍之间。
经过测试,显而易见jackson的流输出方式效率非常高,远远比直接输出string和gson的转换要快的多。
http://www.fafrei.com/2011/02/gson%e5%92%8cjackson%e7%94%9f%e6%88%90json%e7%ae%80%e5%8d%95%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94/
jackson官方地址:
http://wiki.fasterxml.com/JacksonInFiveMinutes#Full_Data_Binding_.28POJO.29_Example