前言:
最近接到一個案子處理資料比較重,邏輯上還必須使用到雙迴圈。
但大概才3000多筆資料而已
在雙迴圈+大量資料的情況下,用普通的for迴圈一秒居然才跑四筆....
這真的很讓人無言
原本有嘗試使用多執行緒去分割資料,分開讀取。
但效果還是和預想的差很多,畢竟一秒只跑四筆資料
最後我找到的解決方式 foreach
拿三千筆數量下去計算:
普通for要跑750s
foreach 1s結束
處理起來普通版for迴圈跟樹懶一樣讓人無言
實作:
ListStringList = new ArrayList<>(); //用普通版迴圈 創建資料 for (int i = 0; i < 10000; i++) { StringList.add("比對資料 - " + i); } //普通版迴圈 for (int i = 0; i < StringList.size(); i++) { Log.d("CHECKPOINT", "check i " + StringList.get(i)); } //Foreach 加強版回圈 for (String item : StringList) { Log.d("CHECKPOINT", "check i " + item); }
為什麼會比較快呢?
普通for迴圈就是照著開始設定的 i 一個一個下去跑
foreach是用『遍歷』的方式下去跑
差在哪呢?
何謂遍歷?
一張圖了解差別
foreach遍歷
遍歷 |
結論:
當處理的資料量很大很大時,foreach超級強!!
當資料量小,很容易就跑完,反而普通版的迴圈效能會比較好
可以想像成
你想運算的東西如果是工廠
普通版For就是一條生產線
Foreach是一間工廠多開很多條生產線
如果你運算量很小,你還要多花效能去多開生產線,告訴工人要做什麼,很不划算。
反而拖累整間工廠的運作
補充:
如果要再foreach遍歷的迴圈內計算count
可以使用這種方式
//Foreach 加強版回圈 int count = 0; for (String item : StringList) { Log.d("CHECKPOINT", "check i " + item + "count - " + count); count++; }