今天就來講一下Java代碼優化的事情,今天主要聊一下對於for(while等同理)循環的優化。html
做爲三大結構之一的循環,在咱們編寫代碼的時候會常常用到。循環結構讓咱們操做數組、集合和其餘一些有規律的事物變得更加的方便,可是若是咱們在實際開發當中運用不合理,可能會給程序的性能帶來很大的影響。因此咱們仍是須要掌握一些技巧來優化咱們的代碼的。java
嵌套循環數組
- 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
由以上對比可知,優化後性能提高了一倍,嵌套循環應該遵循「外小內大」的原則,這就比如你複製不少個小文件和複製幾個大文件的區別。優化
提取與循環無關的表達式ui
- 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));
二者耗時對比:spa
- 未提取耗時:45973050
- 已提取耗時:1955
代碼中a+b與咱們的循環無關,因此應該把它放到外面,避免重複計算,能夠看出,優化後性能提高了好幾個數量級,這些是不容忽視的。.net
消除循環終止判斷時的方法調用
- 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 {
- for (int i = 0; i < 10000000; i++) {
- }
- } catch (Exception e) {
-
- }
- endTime = System.nanoTime();
- System.out.println("在外部捕獲異常耗時:"+(endTime - stratTime));
二者耗時對比:
- 在內部捕獲異常耗時:12150142
- 在外部捕獲異常耗時:1955
你們都知道,捕獲異常是很耗資源的,因此不要講try catch放到循環內部,優化後一樣有好幾個數量級的提高。
性能優化的內容有不少,代碼優化只是其中一小部分,咱們在平常開發中應養成良好的編碼習慣。接下來會跟你們探討更多關於性能優化的內容,但願你們積極交流指導。