首页 技术 正文
技术 2022年11月15日
0 收藏 353 点赞 2,916 浏览 12675 个字

博客: http://colobu.com

jvm-serializers提供了一个非常好的比較各种Java序列化的的測试套件。 它罗列了各种序列化框架。 能够自己主动生成測试报告。

我在AWS c3.xlarge机器上进行了測试,一下是測试报告与解析。

关键的測试数据的统计代码例如以下:

123456789101112131415161718192021222324252627
public double runWithTimeMeasurement(int timeMillis, TestCase tc, int iterations) throws Exception   {       long start = System.currentTimeMillis();              double sumTime = 0;       int count = 0;       System.err.println("test-time "+timeMillis+" iteration "+iterations);       while ( System.currentTimeMillis()-start < timeMillis )        {           double time = tc.run(transformer, serializer, value, iterations);           sumTime += time;           measurementVals[count] = time;           count++;       }       double avg = sumTime / count;       Arrays.sort(measurementVals,0,count);       System.err.println("-----------------------------------------------------------------------------");       System.err.println(serializer.getName());       System.err.println("min:" + measurementVals[0]);       System.err.println("1/4:"+measurementVals[count/4]);       System.err.println("1/2:"+measurementVals[count/2]);       System.err.println("3/4:"+measurementVals[count/4*3]);       System.err.println("max:"+measurementVals[count-1]);       System.err.println("average:"+ avg +" deviation:"+(avg-measurementVals[count/2]));       System.err.println("-----------------------------------------------------------------------------");       return avg;   }

測试时序列化和反序列化会迭代多次。默认2000次。

測试会有一个限定时间,一轮測试完毕后时间还有的话还会继续新的一轮的測试。 因此, 因为不同的框架花费的时间不同, 測试的轮数也不一样。

測试平台

OS:Linux (CentOS 6.4)

JVM:JDK 1.7.0_17

CPU: c3.xlarge

Cores (incl HT):4

免责声明

本測试主要关注无循环引用的数据结构, 可是如此众多的序列化框架还是各有不同:

  • 有些支持循环引用检測
  • 有些会输出所有的元数据。有些不会
  • 有些支持跨平台,有些仅仅支持特定的编程语言
  • 有些是基于文本的。有些却基于二进制
  • 有些支持向前向后兼容, 有些仅仅支持向前或者向后,有些所有不支持

(查看ToolBehavior页面以了解一些框架的特性)

虽然别的測试数据可能会生成不同的測试结果(比如在每一个字符串中添加非ascii字符), 此測试还是会提供一个各个序列化框架的性能的原始预计。

序列化框架Serializers(无共享引用)

  • 无循环引用。 一个对象假设被引用两次则会序列化两次
  • 没有手工优化
  • schema预先已知

Ser Time+Deser Time (ns)

Java序列化框架性能比較Ser
Time+Deser Time (ns)

Size, Compressed in bytes

cht=bhs&chs=600×374&chd=t:129,131,133,133,139,146,150,151,147,167,244,264,284,238,233,253,253,253%7C80,80,88,88,86,87,89,100,108,122,97,81,93,148,216,215,215,215&chco=5d99f9,4d89f9&chdlp=t&chbh=15&chds=0,468&chxr=1,0,468&chxt=y,x&chxl=0:%7Cjson%2Fjavax-stream%2Fglassfish%7Cjson%2Fgson%2Fmanual%7Cjson%2Fjackson%2Fmanual%7Cjson%2Fprotostuff-manual%7Ccbor%2Fjackson%2Fmanual%7Cxml%2Ffastinfo-manual%7Cxml%2Fxstream%2Bc-fastinfo%7Csmile%2Fjackson%2Fmanual%7Cjboss-marshalling-river-ct-manual%7Cjava-manual%7Cwobly%7Cprotostuff-manual%7Cmsgpack-manual%7Cwobly-compact%7Cavro-specific%7Cavro-generic%7Ckryo-manual%7Ckryo-opt” alt=”Size, Compressed in bytes”>Size,
Compressed in bytes

123456789101112131415161718192021222324252627282930313233
pre.                               create     ser   deser   total   size  +dflkryo-manual                            81     670     792    1462    211   131protostuff-manual                      81     608     915    1523    239   150wobly                                  48    1147     701    1848    251   151kryo-opt                               81     837    1059    1896    209   129wobly-compact                          48    1175     748    1923    225   139java-manual                            80    1341     848    2190    255   147smile/jackson/manual                   82    1270    1476    2746    341   244msgpack-manual                         80    1141    1668    2809    233   146json/jackson/manual                    83    1467    1949    3416    468   253jboss-marshalling-river-ct-manual      82    2314    1586    3900    289   167avro-generic                          488    2485    1527    4012    221   133avro-specific                         118    2191    1916    4108    221   133json/protostuff-manual                 81    1757    2472    4229    449   233cbor/jackson/manual                    80    3659    1667    5326    386   238xml/aalto-manual                       82    2724    3902    6626    653   304jboss-marshalling-river-manual         81    2967    5620    8587    483   240json/gson/manual                       81    4798    5826   10624    468   253xml/woodstox-manual                    81    4801    6355   11156    653   304json/json-smart/manual-tree            82    7623    5110   12733    495   269json/gson/manual-tree                  82    7234    8202   15437    485   259xml/fastinfo-manual                    81    8406    7207   15613    377   284xml/javolution/manual                  80    6781   10766   17547    504   263json/json.simple/manual                81    7394   10923   18317    495   269json/org.json/manual-tree              81    8368   10959   19327    485   259json/svenson/databind                  81    5956   14026   19981    495   269xml/xstream+c-aalto                    81    5641   14743   20384    525   273xml/xstream+c-fastinfo                 81   10471   11640   22111    345   264bson/mongodb/manual                    81    4283   19559   23842    495   278xml/xstream+c-woodstox                 80    7326   18877   26203    525   273json/javax-stream/glassfish            81   12791   21756   34547    468   253json/jsonij/manual-jpath               83   38635   15094   53729    478   257json/argo/manual-tree                  81   85473   19416  104889    485   263

特性对性能的影响Cost of features

shows performance vs convenience of manually-selected libs.

  • 循环引用。 schema预知。手工优化cycle free, schema known at compile time, manual optimization: kryo-manual, msgpack-manual
  • 循环引用, schema预知cycle free, schema known at compile time: protostuff, fst-flat-pre, kryo-flat-pre. (note: protostuff uses class generation while the other two just require a list of classes to be written)
  • 循环引用, schema编译时未知 cycle free, schema UNKNOWN at compile time: fst-flat, kryo-flat, protostuff-runtime, msgpack-databind
  • 全图读写。schema编译时未知 full object graph awareness, schema UNKNOWN at compile time: fst, kryo.

Ser Time+Deser Time (ns)

cht=bhs&chs=600×234&chd=t:670,663,908,831,839,1037,1230,1141,1123,2091,2075%7C792,917,985,1083,1104,1468,1470,1668,1821,1858,2041&chco=5d99f9,4d89f9&chdlp=t&chbh=15&chds=0,4116&chxr=1,0,4116&chxt=y,x&chxl=0:%7Cfst%7Ckryo-serializer%7Cmsgpack-databind%7Cmsgpack-manual%7Cfst-flat%7Ckryo-flat%7Cprotostuff-runtime%7Ckryo-flat-pre%7Cfst-flat-pre%7Cprotostuff%7Ckryo-manual” title=”Ser Time+Deser Time (ns)” class=”fancybox”>Java序列化框架性能比較Ser
Time+Deser Time (ns)

Size, Compressed in bytes

Java序列化框架性能比較Size,
Compressed in bytes

123456789101112
pre.                               create     ser   deser   total   size  +dflkryo-manual                            81     670     792    1462    211   131protostuff                            112     663     917    1580    239   150fst-flat-pre                           81     908     984    1893    251   165kryo-flat-pre                          81     831    1083    1914    212   132protostuff-runtime                     82     839    1104    1943    241   151kryo-flat                              81    1037    1468    2505    268   177fst-flat                               81    1230    1469    2700    314   204msgpack-manual                         80    1141    1668    2809    233   146msgpack-databind                       81    1123    1821    2944    233   146kryo-serializer                        81    2091    1858    3949    286   188fst                                    81    2075    2041    4116    316   203

所有的測试结果

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
pre.                               create     ser   deser   total   size  +dflkryo-manual                            81     670     792    1462    211   131protostuff-manual                      81     608     915    1523    239   150protostuff                            112     663     917    1580    239   150protobuf/protostuff                   113     695     927    1622    239   149wobly                                  48    1147     701    1848    251   151fst-flat-pre                           81     908     984    1893    251   165kryo-opt                               81     837    1059    1896    209   129protostuff-graph                      112     946     963    1909    239   150kryo-flat-pre                          81     831    1083    1914    212   132wobly-compact                          48    1175     748    1923    225   139protostuff-runtime                     82     839    1104    1943    241   151protobuf/protostuff-runtime            81     971    1105    2075    241   150java-manual                            80    1341     848    2190    255   147protostuff-graph-runtime               82    1187    1208    2395    241   151kryo-flat                              81    1037    1468    2505    268   177protobuf                              149    1625     942    2567    239   149fst-flat                               81    1230    1469    2700    314   204smile/jackson/manual                   82    1270    1476    2746    341   244msgpack-manual                         80    1141    1668    2809    233   146msgpack-databind                       81    1123    1821    2944    233   146thrift-compact                        139    1844    1101    2945    240   148json/fastjson/databind                 82    1710    1633    3343    486   262json/jackson/manual                    83    1467    1949    3416    468   253thrift                                139    2216    1253    3469    349   197scala/sbinary                         166    2122    1451    3573    255   147smile/jackson+afterburner/databind     81    1757    1868    3625    352   252jboss-marshalling-river-ct-manual      82    2314    1586    3900    289   167kryo-serializer                        81    2091    1858    3949    286   188avro-generic                          488    2485    1527    4012    221   133avro-specific                         118    2191    1916    4108    221   133fst                                    81    2075    2041    4116    316   203json/protostuff-manual                 81    1757    2472    4229    449   233smile/jackson/databind                 81    2095    2250    4346    338   241json/jackson+afterburner/databind      81    2006    2548    4554    485   261json/protostuff-runtime                80    2008    2741    4748    469   243json/jackson/databind                  80    2173    2972    5145    485   261cbor/jackson/manual                    80    3659    1667    5326    386   238json/jackson-jr/databind               81    2282    3435    5716    468   255xml/aalto-manual                       82    2724    3902    6626    653   304cbor/jackson/databind                  81    4112    2659    6771    397   246jboss-marshalling-river-ct             81    4057    2810    6867    298   199jboss-marshalling-river-manual         81    2967    5620    8587    483   240xml/jackson/databind                   81    3558    7028   10585    683   286json/gson/manual                       81    4798    5826   10624    468   253xml/woodstox-manual                    81    4801    6355   11156    653   304json/json-smart/manual-tree            82    7623    5110   12733    495   269hessian                                80    6683    7234   13917    501   313json/gson/databind                     81    7322    7063   14386    486   259bson/jackson/databind                  80    6974    8318   15291    506   286json/gson/manual-tree                  82    7234    8202   15437    485   259xml/fastinfo-manual                    81    8406    7207   15613    377   284xml/javolution/manual                  80    6781   10766   17547    504   263jboss-serialization                    83    9529    8508   18036    932   582json/json.simple/manual                81    7394   10923   18317    495   269json/org.json/manual-tree              81    8368   10959   19327    485   259json/svenson/databind                  81    5956   14026   19981    495   269xml/xstream+c-aalto                    81    5641   14743   20384    525   273xml/xstream+c-fastinfo                 81   10471   11640   22111    345   264bson/mongodb/manual                    81    4283   19559   23842    495   278xml/xstream+c-woodstox                 80    7326   18877   26203    525   273jboss-marshalling-river                81    5915   28347   34261    694   400json/javax-stream/glassfish            81   12791   21756   34547    468   253xml/xstream+c                          81    9050   28265   37315    487   244xml/exi-manual                         83   19634   18063   37697    337   327json/javax-tree/glassfish            1558   16804   23814   40618    485   263java-built-in-serializer               81    7273   36274   43547    889   514java-built-in                          82    7154   37804   44958    889   514stephenerialization                    59    8396   37359   45756   1093   517json/jsonij/manual-jpath               83   38635   15094   53729    478   257jboss-marshalling-serial               80   15148   39180   54328    856   498yaml/jackson/databind                  82   25969   41084   67053    505   260scala/java-built-in                   164   11195   62423   73617   1312   700json/protobuf                         142   11815   73133   84949    488   253json/flexjson/databind                 81   25717   61700   87417    503   273json/argo/manual-tree                  81   85473   19416  104889    485   263json/json-lib/databind                 81   45857  165134  210991    485   263
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
pre.                               Effort          Format         Structure  Misckryo-manual                        MANUAL_OPT      BINARY         FLAT_TREE  [] manually optimized                                       protostuff-manual                  MANUAL_OPT      BINARY         FLAT_TREE  [] manual                                                   protostuff                         CLASSES_KNOWN   BINARY         FLAT_TREE  [] generated code                                           protobuf/protostuff                CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  [] protobuf + generated code                                wobly                              MANUAL_OPT      BINARY         FLAT_TREE  []                                                          fst-flat-pre                       CLASSES_KNOWN   BINARY         FLAT_TREE  [] fst in unshared mode with preregistered classes          kryo-opt                           MANUAL_OPT      BINARY         FLAT_TREE  [] manually optimized                                       protostuff-graph                   CLASSES_KNOWN   BINARY         FULL_GRAPH [] graph + generated code                                   kryo-flat-pre                      CLASSES_KNOWN   BINARY         FLAT_TREE  [] no shared refs, preregistered classes                    wobly-compact                      MANUAL_OPT      BINARY         FLAT_TREE  []                                                          protostuff-runtime                 ZERO_KNOWLEDGE  BINARY         FLAT_TREE  [] reflection                                               protobuf/protostuff-runtime        ZERO_KNOWLEDGE  BIN_CROSSLANG  FLAT_TREE  [] protobuf + reflection                                    java-manual                        MANUAL_OPT      BINARY         FLAT_TREE  []                                                          protostuff-graph-runtime           ZERO_KNOWLEDGE  BINARY         FULL_GRAPH [] graph + reflection                                       kryo-flat                          ZERO_KNOWLEDGE  BINARY         FLAT_TREE  [] default, no shared refs                                  protobuf                           CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  []                                                          fst-flat                           ZERO_KNOWLEDGE  BINARY         FLAT_TREE  [] fst default, but unshared mode                           smile/jackson/manual               MANUAL_OPT      BINARY         FLAT_TREE  []                                                          msgpack-manual                     MANUAL_OPT      BIN_CROSSLANG  FLAT_TREE  []                                                          msgpack-databind                   CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  []                                                          thrift-compact                     CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  []                                                          json/fastjson/databind             ZERO_KNOWLEDGE  JSON           FLAT_TREE  []                                                          json/jackson/manual                MANUAL_OPT      JSON           FLAT_TREE  []                                                          thrift                             CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  []                                                          scala/sbinary                      MISC            MISC           UNKNOWN    [] null                                                     smile/jackson+afterburner/databind ZERO_KNOWLEDGE  BINARY         FLAT_TREE  []                                                          jboss-marshalling-river-ct-manual  MANUAL_OPT      BINARY         FULL_GRAPH [] full graph preregistered classes, manual optimization    kryo-serializer                    ZERO_KNOWLEDGE  BINARY         FULL_GRAPH [] default                                                  avro-generic                       MANUAL_OPT      BIN_CROSSLANG  FLAT_TREE  []                                                          avro-specific                      MANUAL_OPT      BIN_CROSSLANG  UNKNOWN    []                                                          fst                                ZERO_KNOWLEDGE  BINARY         FULL_GRAPH [] default: JDK serialization drop-in-replacement mode      json/protostuff-manual             MANUAL_OPT      JSON           FLAT_TREE  [] json + manual                                            smile/jackson/databind             ZERO_KNOWLEDGE  BINARY         FLAT_TREE  []                                                          json/jackson+afterburner/databind  ZERO_KNOWLEDGE  JSON           FLAT_TREE  [] uses bytecode generation to reduce overhead              json/protostuff-runtime            ZERO_KNOWLEDGE  JSON           FLAT_TREE  [] json + reflection                                        json/jackson/databind              ZERO_KNOWLEDGE  JSON           FLAT_TREE  []                                                          cbor/jackson/manual                MANUAL_OPT      BIN_CROSSLANG  FLAT_TREE  []                                                          json/jackson-jr/databind           ZERO_KNOWLEDGE  JSON           FLAT_TREE  []                                                          xml/aalto-manual                   MANUAL_OPT      XML            UNKNOWN    []                                                          cbor/jackson/databind              ZERO_KNOWLEDGE  BIN_CROSSLANG  FLAT_TREE  []                                                          jboss-marshalling-river-ct         CLASSES_KNOWN   BINARY         FULL_GRAPH [] full graph with preregistered classes                    jboss-marshalling-river-manual     MANUAL_OPT      BINARY         FULL_GRAPH [] full graph with manual optimizations                     xml/jackson/databind               ZERO_KNOWLEDGE  XML            FLAT_TREE  []                                                          json/gson/manual                   MANUAL_OPT      JSON           FLAT_TREE  []                                                          xml/woodstox-manual                MANUAL_OPT      XML            UNKNOWN    []                                                          json/json-smart/manual-tree        MANUAL_OPT      JSON           FLAT_TREE  []                                                          hessian                            ZERO_KNOWLEDGE  BIN_CROSSLANG  FULL_GRAPH []                                                          json/gson/databind                 ZERO_KNOWLEDGE  JSON           FLAT_TREE  []                                                          bson/jackson/databind              CLASSES_KNOWN   BIN_CROSSLANG  FLAT_TREE  []                                                          json/gson/manual-tree              MANUAL_OPT      JSON           FLAT_TREE  []                                                          xml/fastinfo-manual                MANUAL_OPT      XML            UNKNOWN    []                                                          xml/javolution/manual              MANUAL_OPT      XML            FLAT_TREE  []                                                          jboss-serialization                ZERO_KNOWLEDGE  BINARY         FULL_GRAPH []                                                          json/json.simple/manual            MANUAL_OPT      JSON           FLAT_TREE  []                                                          json/org.json/manual-tree          MANUAL_OPT      JSON           FLAT_TREE  []                                                          json/svenson/databind              MANUAL_OPT      JSON           FLAT_TREE  []                                                          xml/xstream+c-aalto                MANUAL_OPT      XML            FLAT_TREE  []                                                          xml/xstream+c-fastinfo             MANUAL_OPT      XML            FLAT_TREE  []                                                          bson/mongodb/manual                MANUAL_OPT      BIN_CROSSLANG  FLAT_TREE  []                                                          xml/xstream+c-woodstox             MANUAL_OPT      XML            FLAT_TREE  []                                                          jboss-marshalling-river            ZERO_KNOWLEDGE  BINARY         FULL_GRAPH [] full graph zero knowledge                                json/javax-stream/glassfish        MANUAL_OPT      JSON           FLAT_TREE  []                                                          xml/xstream+c                      ZERO_KNOWLEDGE  XML            FLAT_TREE  []                                                          xml/exi-manual                     ZERO_KNOWLEDGE  XML            UNKNOWN    []                                                          json/javax-tree/glassfish          ZERO_KNOWLEDGE  JSON           FLAT_TREE  []                                                          java-built-in-serializer           ZERO_KNOWLEDGE  BINARY         FULL_GRAPH []                                                          java-built-in                      ZERO_KNOWLEDGE  BINARY         FLAT_TREE  []                                                          stephenerialization                ZERO_KNOWLEDGE  BINARY         FULL_GRAPH [] null                                                     json/jsonij/manual-jpath           MANUAL_OPT      JSON           FLAT_TREE  []                                                          jboss-marshalling-serial           ZERO_KNOWLEDGE  BINARY         FULL_GRAPH []                                                          yaml/jackson/databind              ZERO_KNOWLEDGE  JSON           FULL_GRAPH []                                                          scala/java-built-in                MISC            MISC           UNKNOWN    [] null                                                     json/protobuf                      CLASSES_KNOWN   JSON           FLAT_TREE  []                                                          json/flexjson/databind             ZERO_KNOWLEDGE  JSON           FULL_GRAPH []                                                          json/argo/manual-tree              MANUAL_OPT      JSON           FLAT_TREE  []                                                          json/json-lib/databind             ZERO_KNOWLEDGE  JSON           FLAT_TREE  []
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,078
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,553
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,402
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,177
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,814
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,898