-
Notifications
You must be signed in to change notification settings - Fork 477
fastjson_benchmark
- fastjson2 2.0.13
- fastjson1 1.0.83
- jackson 2.13.4
- gson 2.9.1
- kryo 5.3.0
- hessian 4.0.66
测试的服务器基于阿里云最新代ECS,包括x64架构的Intel和AMD处理器,ARM架构的AltraMax和阿里云平头哥的倚天处理器。
cs.c7a.xlarge
ecs.c7a.xlarge
ecs.c6r.xlarge
ecs.g8m.xlarge
这个是阿里云当前代标准型ECS,处理器型号 Intel Xeon(Ice Lake) Platinum 8369B,4核,8G内存
这个是阿里云当前代标准型ECS,处理器型号 AMD EPYC™ Milan 7T83,4核,8G内存
这个是阿里云上售卖ARM处理器ECS,处理器型号 Ampere Altra / AltraMax,4核,8G内存
这个是阿里云上售卖ARM处理器,处理器型号 Yitian 710,4核,16G内存。这个是阿里云平头哥的倚天710处理器,需要联系客服才能购买。
基于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
-
运行方式测试代码方式
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
原始数据 https://github.com/alibaba/fastjson2/blob/2.0.13/docs/benchmark/benchmark_2.0.13_raw.md
这个是最常用的场景,将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%) |
这个场景是将格式化过的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%) |
这个场景是将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%) |
这个是将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%) |
这个是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%) |
这个是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%) |
这个场景是将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%) |
这个场景是将二进制的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%) |