一、背景
前面发了一篇引起了一些争论(http://my.oschina.net/noahxiao/blog/112759),有人建议alibaba/fastjson不错,我还是继续上次的测试程序加入了alibaba/fastjson的测试实现,来测一测。
二、测试方式
同前一篇(http://my.oschina.net/noahxiao/blog/112759)中的一样,测试一个Map。
为了基于公平考虑所有JSON解析器,byte[]都将转为String传入解析器。输出json时也是先输出String再getBytes转为byte[]。因为alibaba/fastjson有直接处理byte[]的方法,这里并没有使用。
三、比较对象
Java:
- 手写Java(1.6.0_32)
- Common Lang3(3.1)的SerializationUtils
- Gson(2.2.2)
- json-smart(2.0-RC2)
- alibaba/fastjson(1.1.27)
四、测试结果(alibaba/fastjson)
Map大小(10-100)循环10万次
序列化时间比较(y为序列化时间ms)
反序列化时间比较 (y为反序列化时间ms)
序列化时间汇总比较(y为序列化与反序列化总时间ms)
序列化后byte大小比较(由于同类线重合显示为2条线)
Map大小(100-1000)循环1万次
序列化时间比较(y为序列化时间ms)
反序列化时间比较(y为反序列化时间ms)
序列化时间汇总比较(y为序列化与反序列化总时间ms)
序列化后byte大小比较(由于同类线重合显示为2条线)
比较总结
这里只对alibaba/fastjson做一些总结,其它的可以参考前文( http://my.oschina.net/noahxiao/blog/112759)。
Map在小于100时:
fastjson在序列化过程与Gson差不多,Map小于70时优于Gson。
fastjson在反序列化过程表现不错,优于Gson,但还是没有json-smart表现好。
Map在大于100小于1000时:
fastjson在序列化过程出现问题,Map大于300时性能急剧下降,比任何一个序列化都要慢(包括Java)。
fastjson在反序列化过程表现还是很好,并没有随Map的增大而变慢。
总的来说fastjson的反序列化表现很好,但序列化过程并不是太理想,拖了后腿。
在这个测试中fastjson依然没有超过json-smart的性能。
五、测试代码(alibaba/fastjson测试实现)
package org.noahx.javavsjson;
import com.alibaba.fastjson.JSON;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
* Created with IntelliJ IDEA.
* User: noah
* Date: 3/11/13
* Time: 10:13 AM
* To change this template use File | Settings | File Templates.
*/
public class FastJsonSerializationTest implements SerializationTest {
@Override
public String getTestName() {
return "alibaba/fastjson";
}
@Override
public Map<String, Object> testBytes2Map(byte[] bytes) {
Map<String, Object> map = null;
try {
map = (Map<String, Object>) JSON.parse(new String(bytes, "UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return map;
}
@Override
public byte[] testMap2Bytes(Map<String, Object> map) {
byte[] bytes = null;
try {
bytes = JSON.toJSONString(map).getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return bytes;
}
}
源代码下载:http://sdrv.ms/ZsWomK
P.S.
fastjson在反序列化Map<String,Object>时,value整数大于Integer范围的会转换为BigDecimal。浮点数也会转为BigDecimal。