2012-07-20 69 views
1

我知道,使用一種方法,而不是一行一行地做所有事情,所以讓我們把這個假設分開。是否添加了許多方法來降低性能?

我在問自己,如果做同樣的事情調用一個方法需要更多的時間(對於方法的調用),或者想不到,想象生成的字節代碼是相同的。

回答

5

理論上來說,是的,大多數情況下,您正在創建一個新的堆棧框架來執行計算。實際上,不,你幾乎不會注意到性能受到影響。對這個問題的充分討論會更復雜一些,它與生成的字節代碼和運行的機器/虛擬機的性能有關。

+0

當然,因爲這是Java,所以要注意的另一件事是JVM將查看熱點方法並花費更多時間來優化它們。 – Robert 2012-07-20 19:05:10

1

串行程序(一步一步)比運行方法快,因爲你必須花時間掃描代碼找到方法並運行它。然而這一次是小到對性能有任何影響。

2

的說法是正確的達到一定限度,如調用一個方法將導致建立一個運行時堆棧,其中包含行執行代碼中,局部變量,的程序計數器,如果它的非靜態,那麼「this」也是。

2.但是這不會對HighSpeed處理器和強大的IDE產生任何影響。

此外,如果你是沒有使用方法,那麼這將是DRY原則的違反(一次且僅一次),其中指出,人們應該保持在一個單說理的地方所有的信息和行爲。

1

確定模塊化代碼是一個好主意,它不應該在性能上產生顯着差異。

除外。它可能會產生很大的差異,原因不得不與技術,但與人性。

是很自然的看線,如

a = b + c; 

Foo(bar); 

,並認爲它們的價格差不多,他們可能,但可能沒有。

問題是,方法是額外的代碼磁鐵,包括額外的方法調用。

然後,我在做性能調整時發現的是我抓取堆棧樣本,對於他們來說20-30級的深度並不罕見。 如果我檢查堆棧樣本中的每個調用,幾乎每個調用都很合理。

差不多。

只需要一個非真正必要的電話就可以完全擊敗表演。 如果我只在兩(2)個堆棧樣本上看到這樣的事情,我知道我發現了一個很好的優化機會。 例如,如果我抽取三個樣本並在其中兩個樣本上看到,則可以節省的時間比例在2/3附近。換句話說,加速因子可以在的三倍範圍內