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