2011-07-07 34 views
1

編碼時我經常會遇到這個問題。調用方法/函數兩次Vs.保存到變量中,然後調用一次

以下哪個示例是更好的做法?我知道其他因素會影響其中一個是否更好。但總的來說,一個優於另一個。

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

比。

​​

下面是另一個類似的例子:

var a = object.method(x).Value; 
var b = object.method(x).Key; 

比。

var y = object,method(x); 
var a = y.Value; 
var b = y.Key; 

在我的問題換句話說就是:

是更好地調用方法兩次,少了一個變量? 或 將它保存到一個變量並調用該方法兩次更好嗎?

當然,如果該方法導致大量的處理,它可能是聰明的,只需調用一次,但對於一般情況下,方法不是太苛刻,變量的空間不是太大,哪一個更好爲什麼?或者哪一個是另一個的優點?

它們之間的差異可能不會產生很大的差異,但我試圖找到更好的實踐,並希望聽到一些有經驗的程序員的輸入。

非常感謝

回答

1

在變量中緩存值是一個基本的優化(與memoizing有關)。

當真正有必要的時候,如果函數的第二個調用在堆棧上的時間很長。

例如,如果第二次調用在堆棧中佔用10%或20%的時間,那麼通過緩存第一個結果可以節省多少總時間。

You can keep doing things like that, until the code is as fast as possible.

如果我可以舉個例子,很久以前我工作的一個應用程序,有這樣的代碼:

if (!Done()){ 
    do some stuff 
} 
.... 
if (!Done()){ 
    do some other stuff 
} 

由於Done()是如此短,乾淨,簡單的函數調用,它叫了很多。 不要緊,它做了很多事情,包括從數據庫中查詢大量的東西,並把它扔掉。 Stackshots立即發現問題。

+0

感謝您的建議,學習新東西或學習更好,歡呼 – tif

1

這取決於如果你想是線程安全的,如果函數可以調用之間改變。

例如與

if(object.getA().Value != null) { 
    return object.getA().Value; 
} 
return null; 

如果屬性getter Value實施第二次調用返回一個空你將有一個不同的答案。它可以通過實現該方法在第二次調用時返回null,或者如果另一個線程在if和return語句之間引發了將該屬性的結果設置爲null的更新。

該測試實際上是多餘的,因爲如果它爲空則返回null。我猜你的意思是if (object.getA() != null)。然後,前面的段落仍然適用,但getA()而不是Value,但如果getA()在第二次調用時返回null,則if體將拋出空引用異常。

所以這一切都取決於您是否擔心值之間的調用會發生變化。

1

一般規則:避免額外的變量(不必要地引入狀態)。 (打破規則,如果調用該函數兩次會增加太多的開銷)