为什么Spring MVC json序列化比手动调用jackson慢10倍?

时间:2016-07-17 15:13:43

标签: spring performance spring-mvc jackson

使用带有“ab -k -c 50 -n 1000000”选项的apachebench(50个并发线程)显示以下两种方法(手动和弹簧管理的序列化)之间的性能差异为10倍。是否可以通过配置Spring序列化来实现相同的性能?

我在Windows 7,JDK8,i7-6700上运行测试。嵌入式 Tomcat ,与 Undertow Jetty 类似的结果。类似的 WildFly 10 JAX-RS 示例应用程序性能产生与手动弹簧类似的结果,因此我认为Spring自动模式没有理由这么慢。

完整源代码:

ksh

编辑: 跟踪自动序列化: Trace of automatic serialization

手动序列化的痕迹: Trace of manual serialization

1 个答案:

答案 0 :(得分:3)

我唯一的想法是Spring的默认ObjectMapper配置与您在基准测试中使用的默认配置略有不同。就像提到的评论一样,如果让Spring自动处理映射,你可能会看到一些开销,但它不应该有超过百分之几的影响。

为确保比较公平,请将此bean定义添加到您的配置中:

@Bean
@Primary
ObjectMapper objectMapper() {
    return new ObjectMapper(new JsonFactory());
}

并用自动装配字段替换ObjectMapper mapper = new ObjectMapper(new JsonFactory());

@Autowired
ObjectMapper mapper;

并查看基准测试是否返回相同的值。

修改

我想为myselt验证这一点,所以我编写了一个JMeter计划并执行了每个端点5kk次,预热时间为1分钟。结果如预期,方法之间没有重大差异:

Label,# Samples,Average,Min,Max,Std. Dev.,Error %,Throughput,KB/sec,Avg. Bytes
Auto Request,5000000,2,0,108,5.88,0.00%,15577.3,3088.08,203.0
Manual Request,5000000,2,0,149,5.99,0.00%,15660.2,2813.94,184.0

需要注意的重要一点是吞吐量差异 - 汽车的15577.3与手动的15660.2。

Here's my JMeter test plan,如果您想自己测试一下,我就在端口8081上运行。如果我找到时间,我会尝试另一个基准测试框架,也许是加特林。