嵌套循環的優化


需求背景

今天拿到這樣一個需求:有Map A和Map B,這兩個Map都持有着一個同樣的key——id,其對應的value可能相同,也可能不相同。現在需要對兩個Map中該key對應的value相同的鍵值對做些特殊的操作。

這是個很簡單的需求,代碼很簡單,我直接一個循環里嵌套另一個循環去實現這個功能需求:

for(Map.Entry<String, String> entry : mapA.entrySet()) {
    //do something,需要循環10次
    for(Map.Entry<String, String> entry : mapB.entrySet()){
          //do something,需要循環1000次
    }
}

寫的時候也沒有考慮太多,提交代碼給組長review的時候,組長表示這里的循環嵌套這樣寫不好,因為在實際業務中,集合B會比較大,假設mapA的size是10,mapB的size是1000,這樣寫就需要循環10*1000次,畢竟循環的時候需要進行一系列操作,假如有很多人同時通過ui來觸發這段邏輯,就可能存在性能上的問題,對於用戶來說,如果點擊ui上的一個按鈕需要等待個十來秒才有結果,那簡直是毀滅性的用戶體驗。

所以遇到這種需要嵌套循環的時候,應該盡量減少循環的次數;此外,一般情況下將大循環放到內部,將小循環放在外部,也會提高性能。

一種優化思路

根據組長的建議,我可以將內部的大循環的循環次數盡量降低,原本是n*m的總循環次數,可以根據業務需求盡量拆分成n+m的總循環次數。當然,不太可能真的拆分成n+m,只是盡量往這個方向靠攏。

想要實現這個優化,就只能對內部的大循環進行分組。具體怎么分組呢?可以new一個新的map,然后按照id分組(這里是因為我的業務需求中id會重復,所以將id作為分組依據)。將id相同的數據分成一組,然后存放到一個ArrayList中;然后這個id作為key存入map里,而這個ArrayList則作為value存入map里。

假設原本內部大循環的集合size是1000,我們將其分成了10組,而外部小循環的集合size是10,那么原本的101000總循環次數就可以變形成1000+1010次。如下:

for(Map.Entry<String, String> entry : mapB.entrySet()){
     //先對大集合Map B進行分組,並存入一個Map C中,需要循環1000次
}
for(Map.Entry<String, String> entry : mapA.entrySet()) {
    //do something,需要循環10次
    for(Map.Entry<String, String> entry : mapC.entrySet()){
          //do something,需要循環10次
    }
}

當然了,這種優化思路是在特定的功能需求下才能實現的,具體問題具體分析,因為組長的提醒,我才知道原來嵌套循環還可以這樣來優化,代碼之道果然是要日積月累才行。

另外關於大循環在內小循環在外的寫法的具體分析,可以看看這篇文章:for循環嵌套的效率

可惜暫時我還看不懂。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM