Benchmarking serialization and deserialization of JAXB, Jackson, Protobuf, Thrift, Avro, Java etc

Purpose

The purpose of this project is to bench various serialization protocols. We're going to serialize and deserialize an object.

The object's type is: fr.ekinci.universalserializerbenchmark.pojo.ComplexTestClass

Contract generated classes (similar to ComplexTestClass):

  • Google version: fr.ekinci.universalserializerbenchmark.protocolbuffers.Protobuf.ComplexTestClass
  • Apache Thrift version: fr.ekinci.universalserializerbenchmark.thrift.ThriftComplexTestClass

Implementations:

  • JSON: Jackson
  • XML: Java's JAXB
  • Base64: Java's Base64

Performances

  • JMH version: 1.21
  • VM version: JDK 1.8.0_201, Java HotSpot(TM) 64-Bit Server VM, 25.201-b09
  • VM invoker: C:\opt\java\jdk1.8.0_201\jre\bin\java.exe
  • VM options: -Dvisualvm.id=169428337237333 -Didea.launcher.port=7533 -Didea.launcher.bin.path=C:\opt\intellij-community-2016.1.2\bin -Dfile.encoding=UTF-8
  • Warmup: 5 iterations, 10 s each
  • Measurement: 5 iterations, 10 s each
  • Timeout: 10 min per iteration
  • Threads: 1 thread, will synchronize iterations
  • Benchmark mode: Throughput, ops/time
  • Benchmark: fr.ekinci.universalserializerbenchmark.SerializationBenchmark

JMH output (higher Score is better):

Run complete. Total time: 01:33:04

Benchmark                                             Mode  Cnt        Score       Error  Units
SerializationBenchmark.benchProtobufSerializer       thrpt   25  1254977,233 ± 29777,831  ops/s
SerializationBenchmark.benchThriftBinarySerializer   thrpt   25   417329,277 ±  4405,245  ops/s
SerializationBenchmark.benchThriftCompactSerializer  thrpt   25   324038,012 ± 81010,151  ops/s
SerializationBenchmark.benchJsonSerializer           thrpt   25   292383,079 ±  3004,231  ops/s
SerializationBenchmark.benchAvroBinarySerializer     thrpt   25   175559,756 ± 14856,668  ops/s
SerializationBenchmark.benchAvroJsonSerializer       thrpt   25    46732,602 ±   913,906  ops/s
SerializationBenchmark.benchJavaSerializer           thrpt   25    29038,656 ±   202,627  ops/s
SerializationBenchmark.benchBase64BasicSerializer    thrpt   25    25268,972 ±   265,878  ops/s
SerializationBenchmark.benchBase64UrlSerializer      thrpt   25    25014,805 ±   222,995  ops/s
SerializationBenchmark.benchBase64MimeSerializer     thrpt   25    24172,601 ±   374,089  ops/s
SerializationBenchmark.benchXmlSerializer            thrpt   25     2681,652 ±   115,000  ops/s

Serialized object size and content

Size in bytes:

  • base64Basic : 1024
  • base64Url : 1024
  • base64Mime : 1050
  • java : 766
  • protoBuf : 93
  • thriftBinary : 152
  • thriftCompact: 95
  • avroBinary : 86
  • avroJson : 236
  • xml : 470
  • json : 206

Object string representation:

  • base64Basic:
rO0ABXNyADxmci5la2luY2kudW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay5wb2pvLkNvbXBsZXhUZXN0Q2xhc3OglBPNH4GfsAIABEwABmF0dHIxMHQAEExqYXZhL3V0aWwvTGlzdDtMAAZhdHRyMTFxAH4AAUwABmF0dHIxMnQAPkxmci9la2luY2kvdW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay9wb2pvL0NvbXBsZXhUZXN0Q2xhc3M7TAAGYXR0cjEzcQB+AAF4cgA7ZnIuZWtpbmNpLnVuaXZlcnNhbHNlcmlhbGl6ZXJiZW5jaG1hcmsucG9qby5TaW1wbGVUZXN0Q2xhc3PeB7jNNlxAiQIACUIABWF0dHIxUwAFYXR0cjJJAAVhdHRyM0oABWF0dHI0RgAFYXR0cjVEAAVhdHRyNloABWF0dHI3QwAFYXR0cjhMAAVhdHRyOXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwAQACAAAAAwAAAAAAAAAEQKAAAEAYAAAAAAAAAQA4dAATJsOpJygtw6hfw6fDoCk94oKsJHNyADRmci5la2luY2kudW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay51dGlscy5VdGlscyQxG0+5CaiJlpwCAAB4cgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAA3cEAAAAA3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr+wQCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cEAkMzMzMzMzc3EAfgAKQCRmZmZmZmZzcQB+AApAJJmZmZmZmnhzcgA0ZnIuZWtpbmNpLnVuaXZlcnNhbHNlcmlhbGl6ZXJiZW5jaG1hcmsudXRpbHMuVXRpbHMkMkde3lqarWXZAgAAeHEAfgAIAAAAA3cEAAAAA3QABDExLjF0AAQxMS4ydAAEMTEuM3hwcA==
  • base64Url:
rO0ABXNyADxmci5la2luY2kudW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay5wb2pvLkNvbXBsZXhUZXN0Q2xhc3OglBPNH4GfsAIABEwABmF0dHIxMHQAEExqYXZhL3V0aWwvTGlzdDtMAAZhdHRyMTFxAH4AAUwABmF0dHIxMnQAPkxmci9la2luY2kvdW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay9wb2pvL0NvbXBsZXhUZXN0Q2xhc3M7TAAGYXR0cjEzcQB-AAF4cgA7ZnIuZWtpbmNpLnVuaXZlcnNhbHNlcmlhbGl6ZXJiZW5jaG1hcmsucG9qby5TaW1wbGVUZXN0Q2xhc3PeB7jNNlxAiQIACUIABWF0dHIxUwAFYXR0cjJJAAVhdHRyM0oABWF0dHI0RgAFYXR0cjVEAAVhdHRyNloABWF0dHI3QwAFYXR0cjhMAAVhdHRyOXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwAQACAAAAAwAAAAAAAAAEQKAAAEAYAAAAAAAAAQA4dAATJsOpJygtw6hfw6fDoCk94oKsJHNyADRmci5la2luY2kudW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay51dGlscy5VdGlscyQxG0-5CaiJlpwCAAB4cgATamF2YS51dGlsLkFycmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAA3cEAAAAA3NyABBqYXZhLmxhbmcuRG91YmxlgLPCSilr-wQCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cEAkMzMzMzMzc3EAfgAKQCRmZmZmZmZzcQB-AApAJJmZmZmZmnhzcgA0ZnIuZWtpbmNpLnVuaXZlcnNhbHNlcmlhbGl6ZXJiZW5jaG1hcmsudXRpbHMuVXRpbHMkMkde3lqarWXZAgAAeHEAfgAIAAAAA3cEAAAAA3QABDExLjF0AAQxMS4ydAAEMTEuM3hwcA==
  • base64Mime:
rO0ABXNyADxmci5la2luY2kudW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFyay5wb2pvLkNvbXBs
 ZXhUZXN0Q2xhc3OglBPNH4GfsAIABEwABmF0dHIxMHQAEExqYXZhL3V0aWwvTGlzdDtMAAZhdHRy
 MTFxAH4AAUwABmF0dHIxMnQAPkxmci9la2luY2kvdW5pdmVyc2Fsc2VyaWFsaXplcmJlbmNobWFy
 ay9wb2pvL0NvbXBsZXhUZXN0Q2xhc3M7TAAGYXR0cjEzcQB+AAF4cgA7ZnIuZWtpbmNpLnVuaXZl
 cnNhbHNlcmlhbGl6ZXJiZW5jaG1hcmsucG9qby5TaW1wbGVUZXN0Q2xhc3PeB7jNNlxAiQIACUIA
 BWF0dHIxUwAFYXR0cjJJAAVhdHRyM0oABWF0dHI0RgAFYXR0cjVEAAVhdHRyNloABWF0dHI3QwAF
 YXR0cjhMAAVhdHRyOXQAEkxqYXZhL2xhbmcvU3RyaW5nO3hwAQACAAAAAwAAAAAAAAAEQKAAAEAY
 AAAAAAAAAQA4dAATJsOpJygtw6hfw6fDoCk94oKsJHNyADRmci5la2luY2kudW5pdmVyc2Fsc2Vy
 aWFsaXplcmJlbmNobWFyay51dGlscy5VdGlscyQxG0+5CaiJlpwCAAB4cgATamF2YS51dGlsLkFy
 cmF5TGlzdHiB0h2Zx2GdAwABSQAEc2l6ZXhwAAAAA3cEAAAAA3NyABBqYXZhLmxhbmcuRG91Ymxl
 gLPCSilr+wQCAAFEAAV2YWx1ZXhyABBqYXZhLmxhbmcuTnVtYmVyhqyVHQuU4IsCAAB4cEAkMzMz
 MzMzc3EAfgAKQCRmZmZmZmZzcQB+AApAJJmZmZmZmnhzcgA0ZnIuZWtpbmNpLnVuaXZlcnNhbHNl
 cmlhbGl6ZXJiZW5jaG1hcmsudXRpbHMuVXRpbHMkMkde3lqarWXZAgAAeHEAfgAIAAAAA3cEAAAA
 A3QABDExLjF0AAQxMS4ydAAEMTEuM3hwcA==
  • java:
ACED00057372003C66722E656B696E63692E756E6976657273616C73657269616C697A657262656E63686D61726B2E706F6A6F2E436F6D706C657854657374436C617373A09413CD1F819FB00200044C00066174747231307400104C6A6176612F7574696C2F4C6973743B4C000661747472313171007E00014C000661747472313274003E4C66722F656B696E63692F756E6976657273616C73657269616C697A657262656E63686D61726B2F706F6A6F2F436F6D706C657854657374436C6173733B4C000661747472313371007E00017872003B66722E656B696E63692E756E6976657273616C73657269616C697A657262656E63686D61726B2E706F6A6F2E53696D706C6554657374436C617373DE07B8CD365C40890200094200056174747231530005617474723249000561747472334A00056174747234460005617474723544000561747472365A0005617474723743000561747472384C000561747472397400124C6A6176612F6C616E672F537472696E673B787001000200000003000000000000000440A00000401800000000000001003874001326C3A927282DC3A85FC3A7C3A0293DE282AC247372003466722E656B696E63692E756E6976657273616C73657269616C697A657262656E63686D61726B2E7574696C732E5574696C7324311B4FB909A889969C020000787200136A6176612E7574696C2E41727261794C6973747881D21D99C7619D03000149000473697A65787000000003770400000003737200106A6176612E6C616E672E446F75626C6580B3C24A296BFB0402000144000576616C7565787200106A6176612E6C616E672E4E756D62657286AC951D0B94E08B020000787040243333333333337371007E000A40246666666666667371007E000A402499999999999A787372003466722E656B696E63692E756E6976657273616C73657269616C697A657262656E63686D61726B2E7574696C732E5574696C732432475EDE5A9AAD65D90200007871007E00080000000377040000000374000431312E3174000431312E3274000431312E33787070
  • protoBuf:
0A01011002180320042D0000A04031000000000000184038014201384A1326C3A927282DC3A85FC3A7C3A0293DE282AC245218333333333333244066666666666624409A999999999924405A0431312E315A0431312E325A0431312E33
  • thriftBinary:
030001010600020002080003000000030A0004000000000000000404000540140000000000000400064018000000000000020007010B000800000001380B00090000001326C3A927282DC3A85FC3A7C3A0293DE282AC240F000A040000000340243333333333334024666666666666402499999999999A0F000B0B000000030000000431312E310000000431312E320000000431312E3300
  • thriftCompact:
130114041506160817000000000000144017000000000000184011180138181326C3A927282DC3A85FC3A7C3A0293DE282AC241937333333333333244066666666666624409A9999999999244019380431312E310431312E320431312E3300
  • avroBinary:
0206333333333333244066666666666624409A999999999924400002060831312E310831312E320831312E33000000020406080000A04000000000000018400170022626C3A927282DC3A85FC3A7C3A0293DE282AC24
  • avroJson:
7B22617474723130223A7B226172726179223A5B31302E312C31302E322C31302E335D7D2C22617474723131223A7B226172726179223A5B2231312E31222C2231312E32222C2231312E33225D7D2C22617474723132223A6E756C6C2C22617474723133223A6E756C6C2C226174747231223A312C226174747232223A322C226174747233223A332C226174747234223A342C226174747235223A352E302C226174747236223A362E302C226174747237223A747275652C226174747238223A35362C226174747239223A7B22737472696E67223A2226C3A927282DC3A85FC3A7C3A0293DE282AC24227D7D
  • xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><complexTestClass><attr1>1</attr1><attr2>2</attr2><attr3>3</attr3><attr4>4</attr4><attr5>5.0</attr5><attr6>6.0</attr6><attr7>true</attr7><attr8>56</attr8><attr9>&amp;é'(-è_çà)=€$</attr9><attr10>10.1</attr10><attr10>10.2</attr10><attr10>10.3</attr10><attr11>11.1</attr11><attr11>11.2</attr11><attr11>11.3</attr11></complexTestClass>
  • json:
{"attr1":1,"attr2":2,"attr3":3,"attr4":4,"attr5":5.0,"attr6":6.0,"attr7":true,"attr8":"8","attr9":"&é'(-è_çà)=€$","attr10":[10.1,10.2,10.3],"attr11":["11.1","11.2","11.3"],"attr12":null,"attr13":null}