菜鳥要做架構師(二)——java效能最佳化之for迴圈,java效能最佳化

來源:互聯網
上載者:User

菜鳥要做架構師(二)——java效能最佳化之for迴圈,java效能最佳化

完成同樣的功能,用不同的代碼來實現,效能上可能會有比較大的差別,所以對於一些效能敏感的模組來說,對代碼進行一定的最佳化還是很有必要的。今天就來說一下java代碼最佳化的事情,今天主要聊一下對於for(while等同理)迴圈的最佳化。


作為三大結構之一的迴圈,在我們編寫代碼的時候會經常用到。迴圈結構讓我們運算元組、集合和其他一些有規律的事物變得更加的方便,但是如果我們在實際開發當中運用不合理,可能會給程式的效能帶來很大的影響。所以我們還是需要掌握一些技巧來最佳化我們的代碼的。


嵌套迴圈

stratTime = System.nanoTime();for (int i = 0; i < 10000000; i++) {for (int j = 0; j < 10; j++) {}}endTime = System.nanoTime();System.out.println("外大內小耗時:"+ (endTime - stratTime));

應改為:

stratTime = System.nanoTime();for (int i = 0; i <10 ; i++) {for (int j = 0; j < 10000000; j++) {}}endTime = System.nanoTime();System.out.println("外小內大耗時:"+(endTime - stratTime));

兩者耗時對比:

外大內小耗時:200192114外小內大耗時:97995997

由以上對比可知,最佳化後效能提升了一倍,嵌套迴圈應該遵循“外小內大”的原則,這就好比你複製很多個小檔案和複製幾個大檔案的區別。


提取與迴圈無關的運算式

stratTime = System.nanoTime();for (int i = 0; i < 10000000; i++) {i=i*a*b;}endTime = System.nanoTime();System.out.println("未提取耗時:"+(endTime - stratTime));

應改為:

stratTime = System.nanoTime();c = a+b;for (int i = 0; i < 10000000; i++) {i=i*c;}endTime = System.nanoTime();System.out.println("已提取耗時:"+(endTime - stratTime));


兩者耗時對比:

未提取耗時:45973050已提取耗時:1955

代碼中a+b與我們的迴圈無關,所以應該把它放到外面,避免重複計算,可以看出,最佳化後效能提升了好幾個數量級,這些是不容忽視的。


消除迴圈終止判斷時的方法調用

stratTime = System.nanoTime();for (int i = 0; i < list.size(); i++) {}endTime = System.nanoTime();System.out.println("未最佳化list耗時:"+(endTime - stratTime));


應改為:

stratTime = System.nanoTime();int size = list.size();for (int i = 0; i < size; i++) {}endTime = System.nanoTime();System.out.println("最佳化list耗時:"+(endTime - stratTime));

兩者耗時對比:

未最佳化list耗時:27375最佳化list耗時:2444


list.size()每次迴圈都會被執行一次,這無疑會影響程式的效能,所以應該將其放到迴圈外面,用一個變數來代替,最佳化前後的對比也很明顯。


異常捕獲

stratTime = System.nanoTime();for (int i = 0; i < 10000000; i++) {try {} catch (Exception e) {}}endTime = System.nanoTime();System.out.println("在內部捕獲異常耗時:"+(endTime - stratTime));

應改為:

stratTime = System.nanoTime();try {} catch (Exception e) {for (int i = 0; i < 10000000; i++) {}}endTime = System.nanoTime();System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));


兩者耗時對比:

在內部捕獲異常耗時:12150142在外部捕獲異常耗時:1955

大家都知道,捕獲異常是很耗資源的,所以不要講try catch放到迴圈內部,最佳化後同樣有好幾個數量級的提升。


效能最佳化的內容有很多,代碼最佳化只是其中一小部分,我們在日常開發中應養成良好的編碼習慣。接下來會跟大家探討

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.