Skip to content

fastjson_benchmark

温绍锦 edited this page Sep 10, 2022 · 37 revisions

1. 测试环境

1.1 各个库的版本

  • fastjson2 2.0.13
  • fastjson1 1.0.83
  • jackson 2.13.4
  • gson 2.9.1
  • kryo 5.3.0
  • hessian 4.0.66

1.2 服务器环境

测试的服务器基于阿里云最新代ECS,包括x64架构的Intel和AMD处理器,ARM架构的AltraMax和阿里云平头哥的倚天处理器。

cs.c7a.xlarge
ecs.c7a.xlarge
ecs.c6r.xlarge
ecs.g8m.xlarge

ecs.c7.xlarge

这个是阿里云当前代标准型ECS,处理器型号 Intel Xeon(Ice Lake) Platinum 8369B,4核,8G内存 image

ecs.c7a.xlarge

这个是阿里云当前代标准型ECS,处理器型号 AMD EPYC™ Milan 7T83,4核,8G内存 image

ecs.c6r.xlarge

这个是阿里云上售卖ARM处理器ECS,处理器型号 Ampere Altra / AltraMax,4核,8G内存 image

ecs.g8m.xlarge

这个是阿里云上售卖ARM处理器,处理器型号 Yitian 710,4核,16G内存。这个是阿里云平头哥的倚天710处理器,需要联系客服才能购买。 image

1.3 JDK版本

基于Oracle最新版本的Linux x64/aarch64的JDK版本,下载地址 https://www.oracle.com/java/technologies/

  • oracle-jdk1.8.0_341
  • oracle-jdk-11.0.16
  • oracle-jdk-17.0.4
  • oracle-jdk-18.0.2

1.4 测试代码以及运行方式

git clone https://github.com/alibaba/fastjson2
cd fastjson2
git checkout 2.0.13
mvn clean install -Dmaven.test.skip
~/Install/jdk-1.8.0_341/bin/java -cp ~/git/fastjson2/benchmark/target/fastjson2-benchmarks.jar com.alibaba.fastjson2.benchmark.eishay.Eishay
~/Install/jdk-11.0.16/bin/java -cp ~/git/fastjson2/benchmark/target/fastjson2-benchmarks.jar com.alibaba.fastjson2.benchmark.eishay.Eishay
~/Install/jdk-17.0.4/bin/java -cp ~/git/fastjson2/benchmark/target/fastjson2-benchmarks.jar com.alibaba.fastjson2.benchmark.eishay.Eishay
~/Install/jdk-18.0.2/bin/java -cp ~/git/fastjson2/benchmark/target/fastjson2-benchmarks.jar com.alibaba.fastjson2.benchmark.eishay.Eishay

2. 测试数据&结果分析

原始数据 https://github.com/alibaba/fastjson2/blob/2.0.13/docs/benchmark/benchmark_2.0.13_raw.md

2.1 EishayParseString

这个是最常用的场景,将JSON格式字符串反序列化为Java对象,这个场景在fastjson中的代码如下:

String str = "...";
Bean bean = JSON.parseJSONObject(str, Bean.class);

这个场景是fastjson1最强的场景;

在ecs.c7.xlarge-oracle-jdk1.8.0_341_x64环境中,只相当于只相当于fastjson2的74.34%;jackson则只相当于fastjson2的38.71%; gson是fastjson2的31.75%,也就是说这个最常见的反序列化场景,fastjson2的性能差不多是jackson/gson的三倍。

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > fastjson1 > jackson > gson
jdk8  100%        74.36%      38.71%    31.75%
jdk11 100%        74.5%       38.34%    34.38%
jdk17 100%        92.12%      36.91%    33.54%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 1360.568 1011.738 (74.36%) 526.676 (38.71%) 432.017 (31.75%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 1228.065 914.894 (74.5%) 470.822 (38.34%) 422.16 (34.38%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 1364.202 1256.679 (92.12%) 503.53 (36.91%) 457.547 (33.54%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 1370.066 1179.882 (86.12%) 492.247 (35.93%) 420.361 (30.68%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1286.529 1071.109 (83.26%) 525.017 (40.81%) 454.12 (35.3%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 1249.335 940.833 (75.31%) 485.729 (38.88%) 468.326 (37.49%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 1310.954 1293.647 (98.68%) 515.493 (39.32%) 511.211 (39%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 1147.499 1179.527 (102.79%) 496.404 (43.26%) 445.762 (38.85%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 872.976 719.895 (82.46%) 379.914 (43.52%) 310.103 (35.52%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 871.471 736.203 (84.48%) 377.196 (43.28%) 318.83 (36.59%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 879.445 1015.535 (115.47%) 378.534 (43.04%) 312.391 (35.52%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 880.765 993.02 (112.75%) 361.865 (41.09%) 301.743 (34.26%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 914.457 725.44 (79.33%) 367.634 (40.2%) 339.642 (37.14%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 1080.758 808.698 (74.83%) 405.438 (37.51%) 373.572 (34.57%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 1130.264 1028.981 (91.04%) 410.39 (36.31%) 347.428 (30.74%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 990.989 1136.849 (114.72%) 403.869 (40.75%) 362.801 (36.61%)

2.2 EishayParseStringPretty

这个场景是将格式化过的JSON格式字符串反序列化为Java对象,这个场景fastjson1的parse算法不擅长的。这个场景fastjson2表现仍然非常好。 这个场景在ecs.c7.xlarge-oracle-jdk1.8.0_341_x64环境下,fastjson1的性能是fastjson2的27.15,jackson的性能是fastjson2的49.89%,gson是fastjson2的40.59%.

这个场景在fastjson中的代码如下:

// 这里输入的是格式化过后的json字符串
String str = "{\n" +
        "\t\"id\":123\n" +
        "}";
Bean bean = JSON.parseJSONObject(str, Bean.class);

性能排序分别如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > jackson > gson  > fastjson1
jdk8  100%        49.89%    40.59%  27.15%
jdk11 100%        52.01%    44.73%  25.96%
jdk17 100%        46.86%    45.33%  29.79%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 989.92 268.764 (27.15%) 493.855 (49.89%) 401.828 (40.59%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 929.77 241.376 (25.96%) 483.608 (52.01%) 415.913 (44.73%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 987.743 294.252 (29.79%) 462.903 (46.86%) 447.734 (45.33%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 970.0 284.132 (29.29%) 452.741 (46.67%) 395.039 (40.73%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 992.633 282.002 (28.41%) 480.261 (48.38%) 411.905 (41.5%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 873.323 251.499 (28.8%) 446.893 (51.17%) 420.166 (48.11%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 891.968 299.75 (33.61%) 488.85 (54.81%) 482.449 (54.09%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 868.572 293.284 (33.77%) 456.26 (52.53%) 410.161 (47.22%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 685.663 208.336 (30.38%) 345.876 (50.44%) 281.817 (41.1%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 668.422 212.383 (31.77%) 344.776 (51.58%) 295.781 (44.25%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 665.231 242.005 (36.38%) 346.526 (52.09%) 294.261 (44.23%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 673.288 228.153 (33.89%) 333.383 (49.52%) 276.64 (41.09%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 725.106 212.969 (29.37%) 339.355 (46.8%) 314.208 (43.33%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 790.702 228.49 (28.9%) 379.777 (48.03%) 336.26 (42.53%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 814.156 259.078 (31.82%) 379.597 (46.62%) 311.307 (38.24%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 798.532 242.843 (30.41%) 356.333 (44.62%) 290.978 (36.44%)

2.3 EishayParseTreeString

这个场景是将JSON格式字符串反序列化为JSONObject,这也是一个最常见的场景之一,这个场景在fastjson中的代码如下:

String str = "...";
JSONObject jsonObject = JSON.parseJSONObject(str);

fastjson2在这个场景也表现了远超fastjson1/jackson/gson的性能。 在不同的环境中,fastjson1和jackson都只能相当于fastjson2性能的40%~60%,gson则更差一些。

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > fastjson1 > jackson  > gson
jdk8  100%        51.72%      49.62%     33.99%
jdk11 100%        47.48%      52.41%     38.34%
jdk17 100%        54.39%      46.57%     28.78%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 997.653 515.969 (51.72%) 495.047 (49.62%) 339.088 (33.99%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 835.382 396.672 (47.48%) 437.821 (52.41%) 320.745 (38.4%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 1088.249 591.931 (54.39%) 506.817 (46.57%) 313.176 (28.78%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 1128.092 563.691 (49.97%) 456.86 (40.5%) 321.169 (28.47%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1014.7 477.79 (47.09%) 559.775 (55.17%) 374.786 (36.94%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 848.016 423.335 (49.92%) 466.498 (55.01%) 375.204 (44.24%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 980.59 523.15 (53.35%) 554.072 (56.5%) 377.676 (38.52%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 1042.413 527.567 (50.61%) 499.371 (47.91%) 379.75 (36.43%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 561.623 305.922 (54.47%) 359.392 (63.99%) 259.908 (46.28%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 546.837 320.225 (58.56%) 348.703 (63.77%) 262.577 (48.02%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 628.838 358.546 (57.02%) 381.614 (60.69%) 259.51 (41.27%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 632.975 339.814 (53.69%) 364.472 (57.58%) 260.563 (41.16%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 565.736 300.699 (53.15%) 324.266 (57.32%) 262.866 (46.46%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 662.551 361.773 (54.6%) 385.641 (58.21%) 301.285 (45.47%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 827.05 395.672 (47.84%) 424.3 (51.3%) 298.869 (36.14%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 824.21 378.399 (45.91%) 413.141 (50.13%) 280.966 (34.09%)

2.4 EishayParseUTF8Bytes

这个是将UTF8格式的byte数组反序列化为Java对象,这个场景在缓存和RPC场景中常用。

这个场景在fastjson中的代码如下:

byte[] utf8Bytes = ...;
Bean bean = JSON.parseJSONObject(utf8Bytes, Bean.class);

这个场景fastjson2同样表现出了卓越的性能;在JDK8下,fastjson1和jackson的性能分别之后fastjson2的71.23%和53.76%; gson不直接支持输入utf8Bytes,需要先构造字符串,性能只有fastjson2的28.3%。

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > fastjson1 > jackson  > gson
jdk8  100%        71.23%      53.76%     28.3%
jdk11 100%        68.79%      52.92%     29.55%
jdk17 100%        83.94%      49.69%     26.63%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 1111.437 791.627 (71.23%) 597.483 (53.76%) 314.588 (28.3%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 1067.251 734.136 (68.79%) 565.209 (52.96%) 315.374 (29.55%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 1144.942 961.116 (83.94%) 568.964 (49.69%) 319.794 (27.93%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 1200.863 909.789 (75.76%) 551.602 (45.93%) 319.82 (26.63%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1048.072 835.454 (79.71%) 616.641 (58.84%) 335.258 (31.99%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 1056.933 715.322 (67.68%) 584.955 (55.34%) 369.708 (34.98%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 1043.35 934.783 (89.59%) 593.304 (56.87%) 382.881 (36.7%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 1067.695 890.046 (83.36%) 583.981 (54.7%) 354.728 (33.22%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 734.367 564.344 (76.85%) 454.68 (61.91%) 239.708 (32.64%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 756.743 590.756 (78.07%) 432.663 (57.17%) 253.007 (33.43%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 784.689 753.819 (96.07%) 433.961 (55.3%) 253.17 (32.26%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 793.883 744.137 (93.73%) 409.848 (51.63%) 251.777 (31.71%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 776.369 651.404 (83.9%) 400.951 (51.64%) 240.136 (30.93%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 981.758 677.353 (68.99%) 470.72 (47.95%) 294.994 (30.05%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 1022.609 604.3 (59.09%) 387.7 (37.91%) 280.935 (27.47%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 1037.552 718.338 (69.23%) 440.787 (42.48%) 280.512 (27.04%)

2.5 EishayWriteString

这个是Java对象序列化成字符串, 这个是序列化最常用的场景之一。这个场景在fastjson中的代码如下:

Bean bean = ...;
String str = JSON.toJSONString(bean);

在这个最常用的序列化场景,fastjson2表现出远超fastjson1/jackson/gson的性能;这个场景gson表现很差,只有fastjson2的1/5

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > jackson >   fastjson1  > gson
jdk8  100%        59.87%      39.28%       20.49%
jdk11 100%        69.88%      43.98%       20.64%
jdk17 100%        61.62%      36.88%       12%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 1576.265 619.203 (39.28%) 943.772 (59.87%) 322.901 (20.49%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 1335.098 587.182 (43.98%) 933.029 (69.88%) 275.623 (20.64%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 1678.255 618.906 (36.88%) 1034.137 (61.62%) 201.428 (12%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 1644.231 593.6 (36.1%) 908.705 (55.27%) 203.305 (12.36%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1618.597 643.347 (39.75%) 899.484 (55.57%) 376.278 (23.25%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 1440.586 609.974 (42.34%) 950.891 (66.01%) 264.998 (18.4%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 1741.048 640.155 (36.77%) 970.425 (55.74%) 337.577 (19.39%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 1662.442 613.616 (36.91%) 853.506 (51.34%) 318.316 (19.15%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 1044.235 458.396 (43.9%) 571.229 (54.7%) 274.327 (26.27%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 1047.284 427.03 (40.77%) 595.907 (56.9%) 251.026 (23.97%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 1172.453 443.202 (37.8%) 640.451 (54.62%) 189.277 (16.14%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 1125.986 442.262 (39.28%) 584.856 (51.94%) 189.781 (16.85%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 1207.801 488.777 (40.47%) 629.315 (52.1%) 330.416 (27.36%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 1172.745 472.56 (40.3%) 674.348 (57.5%) 288.784 (24.62%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 1347.999 500.066 (37.1%) 605.068 (44.89%) 194.878 (14.46%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 1314.211 448.914 (34.16%) 630.25 (47.96%) 208.63 (15.87%)

2.6 EishayWriteUTF8Bytes

这个是Java对象序列化成UTF格式的byte数组, 这个是最常用的场景之一,在缓存和RPC场景常用。gson不直接支持,需要先序列化为String再转换为UTF8格式的byte数组。

这个场景在fastjson中的代码如下:

Bean bean = ...;
byte[] utf8Bytes = JSON.toJSONBytes(bean);

在这个最常用的序列化场景,fastjson2表现出远超fastjson1/jackson/gson的性能;这个场景gson表现很差,只有fastjson2的1/5不到,在JDK 17下差距更大。

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2 > jackson >   fastjson1  > gson
jdk8  100%        61.30%      38.15%       19.97%
jdk11 100%        52.29%      33.32%       17.23%
jdk17 100%        51.84%      30.65%       10.82%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2 fastjson1 jackson gson
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 1483.805 566.016 (38.15%) 909.579 (61.3%) 296.378 (19.97%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 1607.916 535.732 (33.32%) 840.722 (52.29%) 277.027 (17.23%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 1870.324 573.164 (30.65%) 969.668 (51.84%) 202.284 (10.82%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 1842.545 539.979 (29.31%) 922.569 (50.07%) 203.819 (11.06%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1513.863 577.225 (38.13%) 829.233 (54.78%) 335.696 (22.17%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 1787.631 553.471 (30.96%) 869.786 (48.66%) 252.633 (14.13%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 1703.089 563.399 (33.08%) 866.295 (50.87%) 326.269 (19.16%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 1723.847 535.227 (31.05%) 853.692 (49.52%) 307.143 (17.82%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 1114.874 418.141 (37.51%) 568.404 (50.98%) 235.234 (21.1%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 1155.121 384.802 (33.31%) 553.0 (47.87%) 249.932 (21.64%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 1155.038 386.631 (33.47%) 610.788 (52.88%) 185.482 (16.06%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 1157.346 348.347 (30.1%) 588.702 (50.87%) 185.548 (16.03%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 1322.099 434.992 (32.9%) 644.337 (48.74%) 284.382 (21.51%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 1362.002 424.507 (31.17%) 538.537 (39.54%) 271.529 (19.94%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 1357.4 471.138 (34.71%) 676.224 (49.82%) 202.618 (14.93%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 1421.632 409.363 (28.8%) 630.841 (44.37%) 202.765 (14.26%)

2.7 EishayWriteBinary

这个场景是将Java对象序列化为二进制的byte数组,是缓存序列化和RPC场景使用序列化协议的典型场景。

fastson2内置支持二进制格式jsonb,jsonb是fastjson2为了RPC场景设计的序列化和反序列化设置的高性能序列化协议。

jsonb有两种映射方式,将Java对象映射为类似JSONObject的KV格式,也可以映射类似JSONArray的数组格式。

fastjson2JSONBArrayMapping的代码如下:

Bean bean = ...;
byte[] jsonbBytes = JSONB.toBytes(bean, JSONWriter.Feature.BeanToArray);

fastjson2JSONB的代码如下:

Bean bean = ...;
byte[] jsonbBytes = JSONB.toBytes(bean);

fastjson2UTF8Bytes的代码如下:

Bean bean = ...;
byte[] utf8Bytes = JSON.toJSONBytes(bean);

这个场景下,jsonb的性能非常好,在JDK 11/17下性能更好,hessina和java内置序列化都表现很差。

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

      fastjson2JSONB > fastjson2UTF8Bytes> hessian > javaSerialize
jdk8  100%             71.10%              16.14%    11.17%
jdk11 100%             64.15%              13.57%    8.6%
jdk17 100%             55.76%              9.7%      6.69%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2JSONB fastjson2UTF8Bytes hessian javaSerialize
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 2097.46 1491.388 (71.1%) 344.249 (16.41%) 234.23 (11.17%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 2436.506 1562.927 (64.15%) 330.66 (13.57%) 209.629 (8.6%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 3309.755 1845.598 (55.76%) 321.034 (9.7%) 221.56 (6.69%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 3227.077 1828.192 (56.65%) 324.449 (10.05%) 231.471 (7.17%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 2054.803 1504.894 (73.24%) 366.379 (17.83%) 239.777 (11.67%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 2705.693 1764.638 (65.22%) 357.997 (13.23%) 229.602 (8.49%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 2865.521 1596.312 (55.71%) 353.936 (12.35%) 249.249 (8.7%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 2771.114 1749.079 (63.12%) 357.223 (12.89%) 265.558 (9.58%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 1348.365 1103.207 (81.82%) 289.951 (21.5%) 181.14 (13.43%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 1842.171 1145.927 (62.21%) 318.719 (17.3%) 185.214 (10.05%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 1821.557 1155.853 (63.45%) 310.023 (17.02%) 179.866 (9.87%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 1821.794 1159.775 (63.66%) 305.48 (16.77%) 192.008 (10.54%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 1563.48 1300.107 (83.15%) 344.569 (22.04%) 206.703 (13.22%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 2221.289 1323.907 (59.6%) 330.132 (14.86%) 217.229 (9.78%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 2241.298 1309.735 (58.44%) 327.589 (14.62%) 209.455 (9.35%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 2378.319 1427.898 (60.04%) 337.284 (14.18%) 225.171 (9.47%)

2.12 EishayParseBinary

这个场景是将二进制的byte数组反序列化为Java对象,是缓存序列化和RPC场景使用序列化协议的典型场景。

fastjson2JSONBArrayMapping的代码如下:

byte[] jsonbBytes = JSONB.toBytes(bean, JSONWriter.Feature.BeanToArray);
Bean bean = JSONB.parseObject(jsonbBytes, Bean.class, JSONReader.Feature.SupportArrayToBean);

fastjson2JSONB的代码如下:

byte[] jsonbBytes = JSONB.toBytes(bean);
Bean bean = JSONB.parseObject(jsonbBytes, Bean.class);

fastjson2UTF8Bytes的代码如下:

byte[] utf8Bytes = JSON.toJSONBytes(bean);
Bean bean = JSON.parseObject(utf8Bytes, Bean.class);

性能排序如下:

// ecs.c7.xlarge-oracle-jdk1.8.0_341_x64

这个场景下,jsonb的性能非常好,在JDK 11/17下性能更好,hessina表现很差,java内置序列化都表现极差。

      fastjson2JSONB > fastjson2UTF8Bytes> hessian > javaSerialize
jdk8  100%             66.91%              16.85%    2.82%
jdk11 100%             46.97%              10.19%    1.97%
jdk17 100%             42.88%              8.81%     1.85%

下面是不同CPU不同JDK下的性能比较表格,第1列是阿里云机器规格,第2列是JDK的版本信息,第3列到第6列是不同库的JMH的Throughput数据,越大越好。 第4列到第6列中的百分比是Throughput相比fastjson2的比,比如第三列的百分比是fastjson1/fastjson2的百分数表示。

aliyun ecs spec jdk version fastjson2JSONB fastjson2UTF8Bytes hessian javaSerialize
ecs.c7.xlarge oracle-jdk1.8.0_341_x64 1649.494 1103.643 (66.91%) 277.963 (16.85%) 46.566 (2.82%)
ecs.c7.xlarge oracle-jdk-11.0.16_x64 2438.929 1143.151 (46.87%) 248.418 (10.19%) 48.052 (1.97%)
ecs.c7.xlarge oracle-jdk-17.0.4_x64 2939.697 1260.484 (42.88%) 258.96 (8.81%) 54.268 (1.85%)
ecs.c7.xlarge oracle-jdk-18.0.2_x64 2836.159 1272.521 (44.87%) 244.107 (8.61%) 51.249 (1.81%)
ecs.c7a.xlarge oracle-jdk1.8.0_341_x64 1726.105 1073.354 (62.18%) 268.816 (15.57%) 46.993 (2.72%)
ecs.c7a.xlarge oracle-jdk-11.0.16_x64 2478.146 1144.019 (46.16%) 245.967 (9.93%) 47.449 (1.91%)
ecs.c7a.xlarge oracle-jdk-17.0.4_x64 2795.659 1082.007 (38.7%) 251.527 (9%) 52.396 (1.87%)
ecs.c7a.xlarge oracle-jdk-18.0.2_x64 2832.787 1096.603 (38.71%) 244.491 (8.63%) 51.601 (1.82%)
ecs.c6r.xlarge oracle-jdk1.8.0_341_aarch64 1275.118 737.23 (57.82%) 192.359 (15.09%) 36.881 (2.89%)
ecs.c6r.xlarge oracle-jdk-11.0.16_aarch64 1665.656 794.867 (47.72%) 178.034 (10.69%) 36.896 (2.22%)
ecs.c6r.xlarge oracle-jdk-17.0.4_aarch64 1807.769 811.996 (44.92%) 207.531 (11.48%) 38.352 (2.12%)
ecs.c6r.xlarge oracle-jdk-18.0.2_aarch64 1738.85 829.281 (47.69%) 187.111 (10.76%) 38.478 (2.21%)
ecs.g8m.xlarge oracle-jdk1.8.0_341_aarch64 1412.516 788.736 (55.84%) 197.661 (13.99%) 42.303 (2.99%)
ecs.g8m.xlarge oracle-jdk-11.0.16_aarch64 2033.422 1012.32 (49.78%) 198.501 (9.76%) 39.644 (1.95%)
ecs.g8m.xlarge oracle-jdk-17.0.4_aarch64 1237.369 1084.535 (87.65%) 208.79 (16.87%) 38.627 (3.12%)
ecs.g8m.xlarge oracle-jdk-18.0.2_aarch64 2194.944 1077.308 (49.08%) 206.82 (9.42%) 40.76 (1.86%)
Clone this wiki locally