需求
- 我需要做一個人員某幾項數據的統計,由於數據量較大,不能一次性加載到內存進行統計。所以采用了遍歷每個用戶。當然也可以分配處理。
- 分析需求可得知,每個用戶其實互不相關,數據的統計可以同步進行,因此考慮到並發執行。而java8剛好提供了這樣的功能,對集合數據的並發執行parallel,所以有了以下測試
為加快統計速度嘗試
-
原代碼用時
- 2018-10-15 15:03:22.863 |-INFO [SimpleAsyncTaskExecutor-1] com.beikbank.settlement.api.jobs.TaskJob [147] -| statMissUser統計數據完成,用時:196.033秒
- 2018-10-15 15:03:22.863 |-INFO [SimpleAsyncTaskExecutor-1] com.beikbank.settlement.api.jobs.TaskJob [147] -| statMissUser統計數據完成,用時:196.033秒
-
java8 代碼用時
- 2018-10-15 14:54:17.487 |-INFO [SimpleAsyncTaskExecutor-1] com.beikbank.settlement.api.jobs.TaskJob [152] -| statMissUser統計數據完成,用時:99.12秒
- 2018-10-15 14:54:17.487 |-INFO [SimpleAsyncTaskExecutor-1] com.beikbank.settlement.api.jobs.TaskJob [152] -| statMissUser統計數據完成,用時:99.12秒
代碼改變
原代碼
for (Map<String, Object> allUser : allUserList) {
String userIdkey = allUser.get("user_id").toString();
...//io數據庫操作
}
使用java8 流並行代碼
allUserList.stream().parallel().forEach(allUser -> {
String userIdkey = allUser.get("user_id").toString();
...//io數據庫操作
});
總結
- 數據統計存在數據庫操作的,使用java8的parallel可以加快統計速度,從上面圖片的對比可以看出,使用parallel后jdbc連接會存在多個並行執行,執行效率和機器配置內存等相關。
- 我使用的是window 2核4G且開了很多其他軟件的情況測試,效率提升1倍左右