在实际项目中,由于需要把接口返回来的对象存在数据库中,所以用到了jackson组件把对象转成json后再保持到数据库中。由于每天处理的数据量太大,而业务对时间的要求非常严格,即使采用4台机器做分布式后,计算时间仍然在2——3个小时,于是性能优化提上了日程。
用jprofiler工具观察到性能主要在两个地方耗时比较多:1.tojson串转换,2.调用其他系统接口。
调用其他系统接口耗时占比在17%左右,tojson转换耗时占比在20%左右。经过小组讨论,决定采用memcached在运行计算之前就缓存数据。缓存命中率为83.4%的情况下,性能如下:
| 统计 | 未使用缓存 | 使用缓存 |
| 计算总耗时 | 39 分钟 | 34 分钟 |
| 单个接口耗时 (ms/ 次) | 38 | 12.9 |
| 接口 耗时总计 | 15 分钟 | 5 分钟 |
| 接口 调用次数 | 24002 | 24007 |
| 数据量 | 5000 | 5000 |
可见,调用接口性能提升2/3。
tojson串转换采用StringBuilder替换jackson的性能对比如下:
| tojson 数据量10000,每个单个1400字节左右 ,测试5次耗时(ms)情况如下 | ||||||
| 1 | 2 | 3 | 4 | 5 | 平均 | |
| jackson | 1204 | 1183 | 1196 | 1202 | 1160 | 1189 |
| new StringBuilder | 1060 | 941 | 912 | 997 | 1160 | 1014 |
| new StringBuilder(1600) | 784 | 824 | 853 | 818 | 778 | 811.4 |
从对比中可以看到 StringBuilder的性能比jackson提高1/4左右。
本文通过引入Memcached缓存及StringBuilder替代Jackson进行JSON序列化,实现了接口调用性能的显著提升,具体表现为接口调用时间减少了2/3,tojson转换效率提升了约1/4。

406

被折叠的 条评论
为什么被折叠?



