2011-04-06 53 views
1

問題我有一個用於與以下行循環:爪哇:大約方法invokation在for循環

method1(similarities.instance(i)); 
method2(similarities.instance(i)); 
method3(similarities.instance(i)); 

如果我存儲到一個變量α= similarities.instance(i)和餘改變爲與環:

method1(a); 
method2(a); 
method3(a) 

;

我有更好的表現嗎?因爲我沒有在每次迭代中調用該方法?這是我應該始終做的事嗎?

回答

2

我想你應該保存它,這將確保沒有值得性能與特點,並且如果similarites.instacnce()有副作用,你不想重複

0

這主要取決於similarities.instance()裏面的內容。下面我假設這3個電話完全相同。

如果它是一個簡單的簡單的getter,你很可能不會注意到任何性能差異。如果資源很多,你可以。儘管如此,我相信JIT可以輕鬆優化3種不同的方法調用,將結果存儲在臨時中。底線是,你不應該擔心微觀優化。

所以在大多數情況下,唯一的區別是可讀性(這本身就足夠重要)。從這個角度來說,我寧願選擇2

+1

幾乎沒有。這意味着JIT可以解決暫停問題。 – Ingo 2011-04-06 10:58:37

2

如果不會失敗(i)等同於相似性。實例(i)對於所有調用,您的第二種方法是適當的,並且是的,您將獲得更好的性能。

更新(基於Ingo's評論): 而且,此外,其結果必然不會受到任何的消費方式

+1

此外,結果不得由任何消費者方法修改 – Ingo 2011-04-06 10:59:44

+0

@Ingo:是的。你是對的。 – 2011-04-06 11:04:21

+0

這似乎只是說可以做第二件事而不回答他的問題呢? – giltanis 2011-04-06 23:17:05

0

像這取決於很多事情修改。如果similarities.instance(i)調用的代價很大,然後將其存儲在一個變量中並重用它會影響性能。

然而這並不是一個可以在一般情況下回答的問題。您需要描述/測試性能差異以查看它是否有所作爲。在大多數情況下,我會說你不應該擔心它,除非方法調用正在像點擊數據庫或網絡一樣慢。

這就是說我會改變它的變量無論如何,以減少重複。

0

這是安全的做,如果以下兩個條件都爲真:

  1. similarities.instance()是一個純函數
  2. 方法1,方法2,方法3使用他們的參數只讀。
0

通過分配該實例變量,就在內存中實例的物理地址存儲爲指針。

通過訪問每次從相似度對象傳遞的實例時,您都可以通過每次通過similarities對象的內存地址傳遞該對象,並在某處以某種方式將內存結構中要存儲的實例的地址存儲在該對象中。

所以是的,它絕對可以提高性能,儘管我並不是100%確定JVM是否自己做了一些優化。但我會說不。

0

「過早的優化是所有罪惡的根源」(C),高德納

此代碼是否真的布特爾的脖子?你有沒有做分析或一些測試來確定這一點?

在一般情況下,我看到只有一個理由來存儲方法調用的價值 - 更好的可讀性。原因的價值必須是永久的,與調用時間無關。 我的意思是這樣的:

int a = someObj.getSomething(); 
method1(a); 
method2(a); 
method3(a); 

這個代碼並不好:

int length = someObj.getLength(); 
for(int i = 0; i < length; i++) 
{ 
... 
} 

有時行爲可能是相反的期望。

+0

只要長度在循環中沒有改變,你說的代碼就是「不好」就好了。 – 2011-04-06 11:17:36

+0

它在這種情況下起作用,但使用這種「優化」沒有意義。代碼變得更加困惑,沒有任何利潤。 – Donz 2011-04-06 11:57:11