论坛首页 Java企业应用论坛

fastjson发布1.1.1版本

浏览 16798 次
精华帖 (0) :: 良好帖 (8) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-07-22   最后修改:2011-07-23
之前的一个版本是1.1.0,1.1.0采用asm和SortFastMatch算法提高性能,由于过于着急展示其优越的性能,没有进行严格测试就发布了。

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/提供的程序做测试,性能数据如下:
  序列化时间 反序列化时间 大小 压缩后大小
java序列化 8546 43199 889 541
hessian 6643 10043 501 313
protobuf3008 1694 239 149
thrift 3182 1951 349 197
avro 3575 2095 221 133
json-lib 45734 149741 485 263
jackson 3245 2986 503 271
fastjson 2292 1499 468 251


测试跑的脚本是:

./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/
   发表时间:2011-07-23  
nice job!
建议温少到infoq英文上发一篇,推介下fastjson。
0 请登录后投票
   发表时间:2011-07-23  
现在用到json的地方都是用fashjson了。希望不会出现什么问题。
0 请登录后投票
   发表时间: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库!
0 请登录后投票
   发表时间:2011-07-23  
序列化方面没准会用到,是否方便单独改造出来
0 请登录后投票
   发表时间:2011-07-23  
freish 写道
序列化方面没准会用到,是否方便单独改造出来


目前没有发布裁剪版本的计划,你是什么需求?很在乎jar包的大小么?
0 请登录后投票
   发表时间:2011-07-23  
比较起来,性能和jackson差不多,功能也差不多,加油.
在里面看了文档,发现了我以前一个同事的名字在测试用例中,激动了一下,又发现旺旺和QQ中,那个同事早已不见了踪影,难道已被他删掉了我?
0 请登录后投票
   发表时间:2011-07-23  
wenshao 写道

我使用github.com/eishay/jvm-serializers/提供的程序做测试,性能数据如下:
  序列化时间 反序列化时间 大小 压缩后大小
java序列化 8546 43199 889 541
hessian 6643 10043 501 313
protobuf3008 1694 239 149
thrift 3182 1951 349 197
avro 3575 2095 221 133
json-lib 45734 149741 485 263
jackson 3245 2986 503 271
fastjson 2292 1499 468 251



呵呵,希望能够同步测试fastjson各个版本的,用于产品版本之间性能比较,便于查看软件升级对性能的影响。
0 请登录后投票
   发表时间:2011-07-23  
最近做的一个东西需要JSON快速序列化和保存
不知道是否能达到良好的处理性能
有时间尝试一下
0 请登录后投票
   发表时间: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;
}
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics