在实际项目中,由于需要把接口返回来的对象存在数据库中,所以用到了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左右。