您的位置:首页 > 编程语言 > Java开发

Java序列化框架性能比较

2016-11-29 11:39 375 查看
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)


Ser
Time+Deser Time (ns)

Size, Compressed in bytes


Size,
Compressed in bytes
123456789101112131415161718192021222324252627
pre.                               create     ser   deser   total   size  +dflprotostuff                            112     663     917    1580    239   150fst-flat-pre                           81     908     984    1893    251   165kryo-flat-pre                          81     831    1083    1914    212   132protobuf                              149    1625     942    2567    239   149msgpack-databind                       81    1123    1821    2944    233   146thrift-compact                        139    1844    1101    2945    240   148json/fastjson/databind                 82    1710    1633    3343    486   262thrift                                139    2216    1253    3469    349   197scala/sbinary                         166    2122    1451    3573    255   147smile/jackson+afterburner/databind     81    1757    1868    3625    352   252smile/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   261json/jackson-jr/databind               81    2282    3435    5716    468   255cbor/jackson/databind                  81    4112    2659    6771    397   246xml/jackson/databind                   81    3558    7028   10585    683   286json/gson/databind                     81    7322    7063   14386    486   259bson/jackson/databind                  80    6974    8318   15291    506   286xml/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                          82    7154   37804   44958    889   514scala/java-built-in                   164   11195   62423   73617   1312   700json/protobuf                         142   11815   73133   84949    488   253json/json-lib/databind                 81   45857  165134  210991    485   263


全对象图序列化框架Full Object Graph Serializers

支持全部的object graph读写. Object graph可能包含循环引用.
无预先处理, 没有预先的类生成,注册. 所有都运行时产生, 比如使用反射.
注意通常不会跨编程语言。 然而JSON/XML格式由于其特殊性可以跨语言.

Ser Time+Deser Time (ns)


Ser
Time+Deser Time (ns)

Size, Compressed [light] in bytes


Size,
Compressed in bytes
1234567891011121314
pre.                               create     ser   deser   total   size  +dflprotostuff-graph                      112     946     963    1909    239   150protostuff-graph-runtime               82    1187    1208    2395    241   151kryo-serializer                        81    2091    1858    3949    286   188fst                                    81    2075    2041    4116    316   203jboss-marshalling-river-ct             81    4057    2810    6867    298   199hessian                                80    6683    7234   13917    501   313jboss-serialization                    83    9529    8508   18036    932   582jboss-marshalling-river                81    5915   28347   34261    694   400java-built-in-serializer               81    7273   36274   43547    889   514stephenerialization                    59    8396   37359   45756   1093   517jboss-marshalling-serial               80   15148   39180   54328    856   498yaml/jackson/databind                  82   25969   41084   67053    505   260json/flexjson/databind                 81   25717   61700   87417    503   273


跨语言二进制序列化框架cross Lang Binary Serializers

无循环引用
schema预先已知

Ser Time+Deser Time (ns)


Ser
Time+Deser Time (ns)

Size, Compressed in bytes


Size,
Compressed in bytes
12345678910
pre.                               create     ser   deser   total   size  +dflprotobuf/protostuff                   113     695     927    1622    239   149protobuf/protostuff-runtime            81     971    1105    2075    241   150protobuf                              149    1625     942    2567    239   149msgpack-databind                       81    1123    1821    2944    233   146thrift-compact                        139    1844    1101    2945    240   148thrift                                139    2216    1253    3469    349   197cbor/jackson/databind                  81    4112    2659    6771    397   246hessian                                80    6683    7234   13917    501   313bson/jackson/databind                  80    6974    8318   15291    506   286


XML/JSon序列化框架

基于文本
Mixed regarding required preparation, object graph awareness (references).

Ser Time+Deser Time (ns)


Ser
Time+Deser Time (ns)

Size, Compressed in bytes


Size,
Compressed in bytes
123456789101112131415
pre.                               create     ser   deser   total   size  +dfljson/fastjson/databind                 82    1710    1633    3343    486   262json/jackson+afterburner/databind      81    2006    2548    4554    485   261json/protostuff-runtime                80    2008    2741    4748    469   243json/jackson/databind                  80    2173    2972    5145    485   261json/jackson-jr/databind               81    2282    3435    5716    468   255xml/jackson/databind                   81    3558    7028   10585    683   286json/gson/databind                     81    7322    7063   14386    486   259xml/xstream+c                          81    9050   28265   37315    487   244xml/exi-manual                         83   19634   18063   37697    337   327json/javax-tree/glassfish            1558   16804   23814   40618    485   263yaml/jackson/databind                  82   25969   41084   67053    505   260json/protobuf                         142   11815   73133   84949    488   253json/flexjson/databind                 81   25717   61700   87417    503   273json/json-lib/databind                 81   45857  165134  210991    485   263


手工优化的序列化框架Manually optimized Serializers

Ser Time+Deser Time (ns)


Ser
Time+Deser Time (ns)

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)


Ser
Time+Deser Time (ns)

Size, Compressed in bytes


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  []
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: