2012-07-24 60 views
0

我想知道下面兩個之間有什麼表現差異?兩個小構造的性能差異

if(i>=0){ 
    //some code here 
} 

//and 

if(i>-1){ 
    //some code here 
} 

接下來的兩點是什麼?

if(i>=0){ 
    //some code here 
} 

//and 

if(i>0 || i==0){ 
    //some code here 
} 

>=將內部轉換爲> || ==

P.S.性能差異會很小,可能可以忽略不計,但我想知道是否有任何性能差異?

+0

在每秒數百萬CPU動作的時代,保存一個動作的動機是什麼? – alfasin 2012-07-24 03:58:22

+0

@alfasin - 對性能的癡迷就像火車發現 - 很難解釋:-) – 2012-07-24 04:12:19

回答

0

我相信第一種方法更好。

第二個要求3周的比較:

  1. if (i > 0)
  2. if (i == 0)
  3. 布爾1. OR和2

然而,實際的結果仍取決於如果一個編譯器是能夠優化2代碼是相同的(因爲他們正在做同樣的事情)。

也許基準是一個更好的主意。

0

您可以使用objdump來檢查相應的彙編代碼,或者檢查在運行時實際退出的指令數量。但是,對於管道,所需的實際週期可能不那麼明確。

1

答案將取決於平臺;即它將取決於Java安裝中的硬件平臺,ISA和JIT編譯器。

這使得知道答案變得毫無意義......因爲您不想浪費時間微觀優化特定的硬件/ ISA/JIT編譯器平臺。

但是,如果您需要知道,那麼您應該對其進行基準測試......注意執行您需要做的所有事情以從Java基準測試中獲得有效結果。


FWIW - 我認爲一個現代的JIT編譯器將在這兩種情況下爲子類生成相同的本機代碼;也就是說,對於您使用哪一個應該沒有什麼不同。但i>0 || i==0是毫無意義的混淆,應該避免出於這個原因。

2

在現代JVM上,我認爲這種思維方式毫無意義。 JVM不只是編譯代碼並停止。它在運行時瞭解您的代碼並相應地修改其行爲。現在我不是一個編譯器專家,但從我所瞭解的JVM可以非常聰明,它可以基本上優化整個if聲明在運行時,如果它看到值i始終評估爲真或假。

只要你覺得像這樣用微型方式「優化」你的代碼,只需停下來並提醒自己,你不像JVM那麼聰明,因爲它會被欺騙。它實際上可以看到代碼在運行時的功能,並相應地改變其行爲。

查看Steve Yegge的演講中的優秀成績單,它提供了一個虛擬機可以令人印象深刻的提示。而這是幾年前現在!

http://steve-yegge.blogspot.com/2008/05/dynamic-languages-strike-back.html

新增更好的例子

這些都是由喬希布洛赫談話談論現在如何標杆微是不可能的幻燈片。您無法查看源代碼行,並知道JVM在運行時會做什麼。我最喜歡的幻燈片是&&這樣的短路電路運營商以前總是比較快,但在現代硬件上,這種情況並非總是如此。完全反直覺,這意味着你應該停止嘗試走這條路。

http://wiki.jvmlangsummit.com/images/1/1d/PerformanceAnxiety2010.pdf

0

這是實現相關的,所以你需要基準您的特定平臺,如果你真的關心。

說了:

  • 前兩個是等價的任何合理的現代硬件/ JVM組合可能。所有的比較都傾向於在現代硬件上執行相同的操作。
  • 對於第二個第二個選項是可能是更快。雖然聰明的編譯器會發現等價併產生相同的本地操作,但我相信一些當前的JIT編譯器不會發現這一點。但是,無論如何,您應該使用第一個選項,因爲閱讀和維護要清晰得多。