锁定老帖子 主题:fastjson发布1.1.1版本
精华帖 (0) :: 良好帖 (8) :: 新手帖 (1) :: 隐藏帖 (0)
|
||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
作者 | 正文 | |||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-22
最后修改:2011-07-23
1.1.1相对于1.1.0,这是一个比较稳定的版本了,行测试覆盖率重新提升到90%以上,build verify testcase 983个。 这个版本进一步完善了asm和SortFieldFastMatch算法,进一步提升了性能,同时补充了大量的testcase,提升了稳定性,我向你推荐使用这个版本,使用这个版本你将会得到令人惊奇的性能。 1.1.1版本的asm来源自objectweb的asm项目,根据fastjson的需要做裁剪,确保引入asm的同时不引起包大小的过渡变大。 为了更好使用sort field martch优化算法提升parser的性能,fastjson序列化的时候,缺省把SerializerFeature.SortField特性打开了。反序列化的时候也缺省把SortFeidFastMatch的选项打开了。这样,如果你用fastjson序列化的文本,输出的结果是按照fieldName排序输出的,parser时也能利用这个顺序进行优化读取。这种情况下,parser能够获得非常好的性能。 我使用github.com/eishay/jvm-serializers/提供的程序做测试,性能数据如下:
测试跑的脚本是: ./run -chart -include=`cat serializers.txt | tr "\\n" ","` data/media.1.cks 从上面的数据来看,fastjson的性能已经超越protobuf、thrift、avro这些二进制协议了。一个文本协议的性能超越二进制协议是很难的,我很高兴向大家宣布我做到了!! 鉴于fastjson优越的性能表现,我建议做如下事情; 1、替换其他所有的json库,java世界里没有其他的json库能够和fastjson可相比了。 2、使用fastjson的序列化和反序列化替换java serialize,java serialize不单性能慢,而且体制大。 3、使用fastjson替换hessian,json协议不必hessian体积大,而且fastjson性能优越,数倍于hessian 4、把fastjson用于memached缓存对象数据。 h3. How to get it? If you're Maven user, just use our maven repository(http://code.alibabatech.com/mvn/releases/) with folloging dependency <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.1.1</version> </dependency> h3. Downlaods Source : http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.1/fastjson-1.1.1.jar Binary :http://code.alibabatech.com/mvn/releases/com/alibaba/fastjson/1.1.1/fastjson-1.1.1-sources.jar Subversion : http://code.alibabatech.com/svn/fastjson/ 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
nice job!
建议温少到infoq英文上发一篇,推介下fastjson。 |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
现在用到json的地方都是用fashjson了。希望不会出现什么问题。
|
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
aa87963014 写道 现在用到json的地方都是用fashjson了。希望不会出现什么问题。
1.0~1.0.6的版本一直是很稳定的。 1.1.0是着急展示性能巨大提升才导致了一个bug,是List<Object>类型字段序列化的bug。 吸取了1.1.0的教训,我补充了200多个test case来保证1.1.1版本的质量,行测试覆盖率重新提升到90%以上。我很重视质量问题,我是希望能够给大家带来一个高质量的json库! |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
序列化方面没准会用到,是否方便单独改造出来
|
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
freish 写道 序列化方面没准会用到,是否方便单独改造出来
目前没有发布裁剪版本的计划,你是什么需求?很在乎jar包的大小么? |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
比较起来,性能和jackson差不多,功能也差不多,加油.
在里面看了文档,发现了我以前一个同事的名字在测试用例中,激动了一下,又发现旺旺和QQ中,那个同事早已不见了踪影,难道已被他删掉了我? |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
wenshao 写道 我使用github.com/eishay/jvm-serializers/提供的程序做测试,性能数据如下:
呵呵,希望能够同步测试fastjson各个版本的,用于产品版本之间性能比较,便于查看软件升级对性能的影响。 |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
最近做的一个东西需要JSON快速序列化和保存
不知道是否能达到良好的处理性能 有时间尝试一下 |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||
发表时间:2011-07-23
最后修改:2011-07-23
如果你跑这个testcase:
http://code.alibabatech.com/svn/fastjson/trunk/src/test/java/com/alibaba/json/test/benchmark/BenchmarkTest.java 通过打开参数-server -XX:+PrintCompilation,将会看到这些内容: 引用 727 57 Fastjson_ASM_MediaContent_1::deserialze (283 bytes) 860 90 Fastjson_ASM_Media_2::deserialze (392 bytes) 755 66 Fastjson_ASM_Image_39::deserialze (227 bytes) 这三个是动态生成的parser类,针对MediaContent、Media、Image三个类动态生成优化过后的parser,并且都被jit编译优化了。 你看这个类: http://code.alibabatech.com/svn/fastjson/trunk/src/test/java/data/media/ImageDeserializer.java Fastjson_ASM_Image_39的代码和这个类似的,ASMDeserializerFactory就是参考这种方式去动态生成parser的。 如果你对objectweb的asm了解,你可以直接看这个: http://code.alibabatech.com/svn/fastjson/trunk/src/main/java/com/alibaba/fastjson/parser/deserializer/ASMDeserializerFactory.java private char[] size_ = "\"size\":".toCharArray(); private char[] uri_ = "\"uri\":".toCharArray(); private char[] titile_ = "\"title\":".toCharArray(); private char[] width_ = "\"width\":".toCharArray(); private char[] height_ = "\"height\":".toCharArray(); public <T> T deserialze(DefaultExtJSONParser parser, Type clazz) { final JSONScanner lexer = (JSONScanner) parser.getLexer(); int height; Size size; String title; String uri; int width; int mark = lexer.getBufferPosition(); char mark_ch = lexer.getCurrent(); int mark_token = lexer.token(); { height = lexer.scanFieldInt(height_); if (lexer.matchStat == JSONScanner.NOT_MATCH) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } } { String value = lexer.scanFieldString(size_); if (lexer.matchStat == JSONScanner.NOT_MATCH) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } size = Size.valueOf(value); } { title = lexer.scanFieldString(titile_); if (lexer.matchStat == JSONScanner.NOT_MATCH) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } } { uri = lexer.scanFieldString(uri_); if (lexer.matchStat == JSONScanner.NOT_MATCH) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } } { width = lexer.scanFieldInt(width_); if (lexer.matchStat == JSONScanner.NOT_MATCH) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } } if (lexer.matchStat != JSONScanner.END) { // 退出快速模式, 进入常规模式 lexer.reset(mark, mark_ch, mark_token); return super.deserialze(parser, clazz); } Image image = new Image(); image.setSize(size); image.setUri(uri); image.setTitle(title); image.setWidth(width); image.setHeight(height); return (T) image; } |
||||||||||||||||||||||||||||||||||||||||||||||
返回顶楼 | ||||||||||||||||||||||||||||||||||||||||||||||