show code block

2018年12月9日 星期日

Java基礎:for and foreach(加強版迴圈)

前言:

最近接到一個案子
處理資料比較重,邏輯上還必須使用到雙迴圈。
但大概才3000多筆資料而已
在雙迴圈+大量資料的情況下,用普通的for迴圈一秒居然才跑四筆....
這真的很讓人無言
原本有嘗試使用多執行緒去分割資料,分開讀取。
但效果還是和預想的差很多,畢竟一秒只跑四筆資料

最後我找到的解決方式 foreach

拿三千筆數量下去計算:
普通for要跑750s
foreach 1s結束

處理起來普通版for迴圈跟樹懶一樣讓人無言

實作:
List StringList = 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遍歷
遍歷
普通for迴圈



結論:


當處理的資料量很大很大時,foreach超級強!!

資料量小,很容易就跑完,反而普通版的迴圈效能會比較好

可以想像成
你想運算的東西如果是工廠
普通版For就是一條生產線
Foreach是一間工廠多開很多條生產線
如果你運算量很小,你還要多花效能去多開生產線,告訴工人要做什麼,很不划算。
反而拖累整間工廠的運作


補充:
如果要再foreach遍歷的迴圈內計算count

可以使用這種方式
//Foreach 加強版回圈
int count = 0;
for (String item : StringList) {
    Log.d("CHECKPOINT", "check i " + item + "count - " + count);
    count++;
}





協程(coroutine) - 協程為什麼要學它?

 Coroutine 協程 再強調一次 協程就是由kotlin官方所提供的線程api //Thread Thread { }.start() //Executor val execu...