2013-07-28 91 views
1

我在這堂課中有這兩種方法。第二種方法做同樣的事情,但成千上萬的多個值(比如說五萬)。那麼哪一個是更好地去: 編輯哪種做法更好(多次調用另一種方法的方法或做同樣的事情本身)

public static int isUsed(int num) { 
    if((port < startPort || port > endPort)) { 
     throw new IllegalArgumentException(); 
    } 
    ServerSocket serverSocket; 
    try { 
     serverSocket = new ServerSocket(port); 
     serverSocket.close(); 
     return false; 
    } catch (IOException e) { 
     return true; 
    } 
} 

public static int areAllUsed(int arr[]) { 
    //do the same thing several thousand times  >>> Is thisbetters OR 
    // call isUsed several thousand times   >>> this is better 
} 

有了更好的我指的是memmory或性能。

回答

4

如果您需要在多個地方重複使用一段邏輯,定義一個函數是重用代碼的最佳方式。在另一個地方複製粘貼相同的邏輯不是一個好主意,因爲它會降低可讀性併成爲維護責任,以防您必須更改邏輯。

很少或沒有性能影響,因爲如果Java編譯器發現它是有益的,它會自動內聯靜態方法。

+0

我只是忘了提及他們可能必須創建新對象的方法中的每個測試。 –

+0

@DigvijayYadav沒關係 - 無論他們在測試中需要做什麼,你的其他方法也必須這樣做,對吧? – dasblinkenlight

+2

然後向我們展示真正的'isUsed()'方法,而不是假的。您可能會將算法分解出來,而無需再次創建相同的對象,但這一切都取決於實際的代碼。 –

2

DRY是答案:不要重複自己。

如果您的算法已在isUsed()中編碼,則不要用另一種方法重新實現。致電isUsed()

JVM的效率足以使差異可以忽略甚至不存在,因爲JIT會將isUsed()方法動態內聯到areAllUsed()

2

在這種情況下,方法調用很可能與性能角度沒有任何區別。對於一個小的方法,JIT編譯器很有可能會在被調用的位置內聯方法體。 (並且注意,對於非靜態最終方法,甚至在某些情況下,甚至是非靜態,非最終方法,它可以做同樣的事情。)

內存使用的差異是微不足道的。


無論採用哪種方法,嘗試猜測編譯器/優化器通常都是一個壞主意。最好寫代碼可讀可維護並讓優化器處理優化。如果性能是一個真正的問題,那麼配置文件使用真實/現實輸入數據完成您的代碼...並使用您的配置文件的結果來確定您應該指導您的工作的位置。

0

這取決於您的應用程序。我會建議打電話多次使用。代碼的線性越小,如果出現問題,調試越容易。如果出現問題,您只需檢查是否有錯誤。

相關問題