2011-09-21 290 views
1

與分配和垃圾收集整數相比,假設調用靜態方法的速度快是否正確?靜態函數訪問的速度

或換言之,fh1或fh2會更好嗎?在fh1中避免了分配,但fh2似乎更簡單。在這種情況下,G.f()是一個相對簡單的方法,它會經常被調用。 fh2和fh1也會經常被調用(可能多達每秒30次)。

僞代碼:

class G { 
    static method int f() {.......} 
} 

class H { 
    method fh1(){ 
    somemethod1(G.f()); 
    somemethod2(G.f()); 
    somemethod3(G.f()); 
    } 

    method fh2(){ 
    int a = G.f(); 
    somemethod1(a); 
    somemethod2(b); 
    ..... 
    } 
} 
+0

你說的分配,避免FH1,但在G.f會發生什麼()呢? – peko

+0

@peko,例如Gf()可以通過使用G類的幾個靜態成員變量,通過對它們應用數學公式來計算派生值(其他東西也是可能的) – tjb

回答

1

每秒30次不經常(每秒100萬次)。因此這裏沒有問題,所以不要優化它。

話雖如此,fh2會更有效率,分配比功能調用便宜。

1

我會在這種特殊情況下使用靜態方法的原因是,如果int值必須改變的潛力。換句話說,如果G.f()正在執行一些邏輯,並且第1次調用可能與第10次調用不同,那麼可以使用靜態方法。像這樣的靜態方法提供了一種通過重用邏輯並使邏輯處於可管理狀態來減少代碼的方法,因此如果需要更改邏輯,則只需在一個位置更改它。

這就是說,在方法fh1中,如果G.f()會在調用fh1()中的三個不同時間所需的時間跨度內發生變化,那麼結果可能會有多大?可能非常小,但仍值得考慮。

我可能會選擇fh2()來保持一致性。性能差異可能可以忽略不計。

+0

函數調用之間的值變化的好處 – tjb

1

在你的例子中,你不是「分配」也不是「垃圾收集」整數。

相反,在fh2中,生活在堆棧上,並且不需要額外的時間來分配/取消分配它。

方法調用花費多長時間取決於方法的代碼。這個電話很快,但仍然比什麼都慢。因此,我會使用fh2版本。

+0

我不喜歡不明白,當你做一個像int a這樣的變量,然後函數調用結束時,不會在一段時間後收集垃圾回收嗎?你是否說它被重用? – tjb

+0

不,它只是堆棧中的一個插槽,並且堆棧指針基本上遞減8或遞增)一些量,留下int,這是一個循環。堆棧不被垃圾收集。 – Ingo

+0

謝謝,那些正在尋找關於這個子主題的額外信息的人應該看看http:// stackoverflow。com/q/2474622/530634 – tjb

0

我們應該忘記小效率,比如約97%的時間:不成熟的優化是所有邪惡的根源。但我們不應該在這個關鍵的3%中放棄我們的機會。一個好的程序員不會因爲這樣的推理而變得自滿,他會明智地仔細看看關鍵代碼;但只有在代碼已被確定

©高德納

+0

是的,我知道這個評論,並同意,但它仍然不知道:) – tjb

+0

另外,如果有明確的最佳做法,那麼它將是很好的遵循它。 – tjb