2014-01-18 19 views
-3

在Java中,假設我有一個表達式X在一個函數中出現多次。一般而言,創建變量並將其設置爲等於X更有效率,還是根本不使用變量?每種方法的優點和缺點是什麼?重複的表達式:更好地製作一個變量或不是?

Ex。說X = 5 + 9 * 9-1000。哪個函數更有效,函數1或函數2?

public void function1() { 
    System.out.println(5+9*9-1000); 
    System.out.println(5+9*9-1000); 
} 

public void function2() { 
    int variable = 5+9*9-1000; 
    System.out.println(variable); 
    System.out.println(variable); 
} 
+1

你真的需要在遊戲早期擔心效率嗎? – csmckelvey

+0

不成熟的優化。 Math.sqrt(allEvil); – MikeTheLiar

+1

根據代碼更清楚的內容決定。通常,使用變量會有所幫助,因爲您可以爲常量表達式提供一個意味着某種東西的名稱。 –

回答

4

兩者都不是更高效。您的表情5+9*9-1000的常數表達。編譯器將在編譯時對其進行評估,並且只有運行時顯示結果(-914)。

The JLS defines constant expressions in Section 15.28。基本上它由文字,運算符和常量變量組成。

通常它更方便,更具可讀性和表達力,可以持續表達而不是自己乘數值。

int secondsPerDayCalc = 86400;  // not obvious it's number of seconds in a day 
int secondsPerDay = 60 * 60 * 24; // constant expression; more readable 

沒有性能損失,因爲它是在編譯時評估的。

0

在這種情況下使用變量或在更復雜的情況下使用函數。是的,可能會提高效率,但真正的問題是代碼的可維護性。如果表達式需要更改,重複的字符串會造成潛在錯誤。

0

一般來說,創建變量並將其設置爲等於X,還是根本不使用變量會更有效?

一般來說,它是不可能說。它可能更有效率。它可能沒有區別。它可能可以想象,甚至效率較低。這一切都取決於JIT編譯器對代碼所做的事情,這取決於您正在使用的JVM,應用程序,甚至是輸入數據。

(在你的具體的例子,這些表達式是常量表達式,它們將在編譯時進行評估。這使得運行效率的問題沒有實際意義。)

什麼是每一種方法的優點/缺點是什麼?

在我看來,最重要的問題是:

  • 可讀性。將表達式分解爲包含臨時變量的子表達式可能使使您的代碼更具可讀性。 (這取決於代碼的複雜性......以及需要維護代碼的人的預期Java閱讀技能。)

  • 副作用。一些表達涉及副作用。在這種情況下,重構使用臨時變量可能會改變計算的含義

最好的一般建議是將這種優化留給JIT編譯器。但如果性能是關鍵問題,而您確實真的需要在此級別進行優化,那麼您需要科學地做到這一點。

  1. 基準您的代碼(正確!)建立一個性能基準。
  2. 對其進行配置以識別熱點。
  3. 修改代碼以提高熱點處的性能。
  4. 重新運行基準測試,看看你是否有改進的東西。
  5. 轉到第二步......

(最有效地利用完全基於你的直覺,你容易浪費大量的時間用最少的可衡量的業績效益最優化。在心裏也承受那手優化一個平臺不一定會提高其他人的表現......)

相關問題