2014-07-07 75 views
-3

所以,最近我一直在試圖找出一些語句是如何「重」是。 例如,如果if語句檢查每個可能的異常,或者會顯着減慢程序,是否是件好事?所以我非常想知道當用了很多的時候,下面的陳述會有多「重」。這是大多隻是一個問題,出於好奇,因爲今天的電腦是如此之快,它可能並不重要,但它也將幫助我做的事情,雖然性能比較的改善可能只是很小的不同方式之間進行選擇。下面的陳述有多「重」?

一個簡單的while循環如何「重」是循環本身不是裏面的代碼?

while(true){} 

A for循環可能對while循環很熟悉嗎?

for(int i = 0; true; i++){} 

一個while while循環可能對上面兩個也很熟悉嗎?

do{...}while(true) 

一個if語句如何「重」這是否得到?

if(true){} 

switch語句

switch(0){ 
    case 0: 
} 

,是一個switch語句少 '重' 或大於else if聲明

和 '重' 的instanceof檢查有 '重' 是什麼呢?

if(obj instanceof Player){} 

的是null檢查我聽說這個人是真正的「光」是真的嗎?

if(obj == null){} 

而一個構造函數調用

new Object(); 

和方法調用

MyClass.doSomething(); 

變量賦值

int i = 10; 

我試着在互聯網上搜索,但我沒有找到一個比較t的網頁把所有的東西都擺放在一起或者是很熟悉。但是如果你們中有些人對此有很好的文檔,我會很樂意閱讀它。

+3

如何「重」是無限while循環?該死的,男人。 – MightyPork

+0

那麼這只是一個例子,我並不是說它是無限的,裏面可能會有一個'break' – Roan

+0

那麼......你可以嘗試對它進行基準測試......雖然我不知道你是如何基準測試循環的開銷。 – MightyPork

回答

1

這個問題的答案几乎所有有「這取決於」。這取決於JITC,什麼是這些電話裏,周圍的代碼,該代碼有多熱,有多好你的分支預測的,等等。但是,如果你擔心的控制流結構的性能,你幾乎可以肯定在看錯誤的地方...

免責聲明:如果你真的把某些東西放在循環中和/或評估一個「真實」的條件,這個分析會直接從窗口中出來,因爲評估這些會降低控制流結構本身的成本。但是我現在就把所有的東西都字面理解,否則我不能給出一個堅實的答案。

while(true){}

這可能會被優化,由JITC無條件分支。所以根本不「沉重」。

for(int i = 0; true; i++){}

再次,JITC優化很可能變成一個無條件轉移+增量這一點。 「重」比while(true),但這是因爲增量比什麼都重要。或許可以由JITC進一步優化;在這種情況下,增量可能會被完全跳過。

do{...} while(true);

while(true)。可能被JITC優化爲無條件分支。

if(true){}

如果這不是在字節碼編譯消除(這可能不是,我想我還記得關於控制流程是怎樣的if報表評估一些特殊的規則),那麼」可能會被JITC優化爲無操作並基本上從程序中消除。

switch(0){ case 0: }

不知道有關這個案子的具體,但我不會感到驚訝,如果JITC優化送人完全。否則,switch可能是跳轉表或二進制搜索ish指令,具體取決於案例的稀疏程度。

,是一個switch語句少「重」或大於else if聲明

這完全取決於1)你是否可以使用一個,而不是其他,和2)「較重」你在比較什麼。所以不能說這個。

如果(OBJ的instanceof播放器){} 如果(OBJ == NULL){}

這兩個特定的片段可能會被JITC被刪除,否則我會期望instanceof== null會相當快,因爲​​我認爲有字節碼指令,我認爲會合理優化。我不確定是否稱這些「重」或「輕」,因爲沒有比較的一點......

new Object();

我聽說這些天創建對象很便宜。所以如果你在談論實際的分配,我會用「輕」去。儘管如此,整個聲明的性能取決於構造函數中發生了什麼。

MyClass.doSomething();

取決於方法是否已內聯。如果是這樣,它就像它變得便宜一樣。如果不是,那麼這是一個vtable查找的代價,這可能會或可能不會很昂貴。不確定。

int i = 10;

可能分配一個值/引用也不貴,因爲這是一個程序,像樣的數目......

+0

非常感謝您的回答。那是我想要的。 – Roan

+0

@Roan沒問題!儘管如此,請勿在代碼中實際使用此信息;正如我所說,如果你改變了你的問題中的任何代碼片段,那麼它就變得毫無價值,正如你可能已經注意到的那樣,最終的答案肯定有很少的確定... – awksp

+0

是的,我不會像我說的那樣使用它這個問題大多出於好奇。但坦克仍然很多:) – Roan