2012-07-08 50 views
0

有人問我關於這一點,並在閱讀了一些大O的東西后,我仍然無法弄清楚哪兩種設計更快。將嵌套循環重新設計爲方法的Java性能

如果我有這樣的嵌套循環的一個方法

public void someMethod(){ 
    for (a=0;a<10;a++){ 
    for (b=0;b<10;b++){ 
     for (c=0;c<10;c++){ 
     for (d=0;d<10;d++){ 
     } 
     } 
    } 
    } 
} 

,我決定重新設計方法,並放置2內的循環,以另一種方法是這樣的

public void someMethod(){ 
    for (a=0;a<10;a++){ 
     for (b=0;b<10;b++){ 
      2loopsMethod(); 
     } 
     } 
    } 

public void 2loopsMethod(){ 
for (c=0;c<10;c++){ 
for (d=0;d<10;d++){ 
} 
} 

}

我的問題是重新設計的方法會更快,原來的代碼,因爲我把它放在另一種方法或將沒有區別?

+2

爲什麼你認爲這可能幫助? – harold 2012-07-08 16:03:07

回答

8

它應該沒有區別。您仍然有四個級別的嵌套循環,因此將部分工作委託給方法調用不會更快。

(技術上的方法調用的開銷的增加將使得第二個例子稍微慢,但如果您的代碼做任何顯著在所有我會感到驚訝,如果你甚至可以衡量的差別。)

+0

我看到感謝回答仍然有很多要了解Java。你知道有一些鏈接,我可以很容易地這種東西?或者只是通過經驗學習? – dimas 2012-07-08 16:07:38

+0

@dimas經驗是最好的老師,但仍然有很多東西需要從書本,教程中學習,並提出像這樣的問題。特別是對於Java,官方的[Java教程](http://docs.oracle.com/javase/tutorial/)是一個非常好的資源,就像http://thenewboston.org/tutorials.php上的Java教程視頻一樣。 – 2012-07-08 20:15:34

+0

感謝鏈接,尤其是視頻,如果我看到人們這樣做,我會學得更快。 – dimas 2012-07-08 20:29:08

1

大O的複雜性是一樣的。我認爲第一個版本更快,因爲你沒有a * b方法調用。理論上方法調用需要額外的時間。

1

重新設計的方法在你的情況下稍慢一點,因爲方法調用需要額外的時間(不太可能,例如C++內聯函數)。如果增加循環迭代次數,你一定會看到差異。

0

由於對方法的編譯器優化,第二個例子是優先停留:

public class Try1 { 
 

 
\t static int sum; 
 
\t public static void main(String[] args) { 
 

 
\t \t long startTime, endTime; 
 

 
\t \t while(true) 
 
\t \t { 
 
\t \t \t sum = 0; 
 
\t \t \t startTime = System.nanoTime(); 
 
\t \t \t for (int i = 0; i < 2000; i++) { \t 
 
\t \t \t \t for (int j = 0; j < 1000; j++) { 
 
\t \t \t \t \t sum = sum + i; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t \t 
 
\t \t \t endTime = System.nanoTime(); 
 
\t \t \t System.out.println("no method took:" + (endTime -startTime)); 
 

 
\t \t \t sum = 0; 
 
\t \t \t startTime = System.nanoTime(); 
 
\t \t \t for (int i = 0; i < 2000; i++) { \t 
 
\t \t \t \t func(i); 
 
\t \t \t } 
 
\t \t \t endTime = System.nanoTime(); 
 
\t \t \t System.out.println("with method took:" + (endTime -startTime)); 
 
\t \t \t 
 
\t \t } 
 

 
\t } 
 

 
\t private static final void func(int i) { 
 
\t \t for (int j = 0; j < 1000; j++) { 
 
\t \t \t sum = sum + i; 
 
\t \t } 
 
\t } 
 

 
}

結束的結果:

沒有方法把:3077459 與方法採取:2418027 沒有方法花了:5535578 用方法花了:76014 沒有辦法花:3857167 與方法了:88844 沒有方法了:3758701 與方法了:89165 沒有方法了:3761588 與方法了:88844