2017-08-11 59 views
0

關於Java,我非常習慣於將所有變量聲明爲私有的,並且生成公有的getter和setter來保持公共約定。通過使用公共變量提高性能?

我覺得很奇怪,雖然:關於getter和setter與分配和返回所請求的值以外的任何功能,有沒有調用類似的方法沒有性能損失:

String getValue() { 
    return value; 
} 

代替:

classInstance.value; 

編譯器在這裏做些什麼來幫助保持函數調用不增加一個額外的週期?如果不是這樣,那麼這個理論命中雪球在更強大的應用程序中會不會受到重創?

編輯:: 爲了澄清,這個問題沒有問你爲什麼應該或不應該使用訪問器方法,問題是你是否使用訪問器來獲得性能。

+1

問題很廣,但一般不使用微詞optymalisation,乾淨可讀性更重要。 –

+0

在任何足夠複雜的程序範圍內,我認爲開銷可以忽略不計 – OldProgrammer

+0

我並不認爲它太寬泛。使用公共變量定義getter和setter方法是否會在Java中增加額外的工作週期? 個人而言,我不認爲classInstance.getValue()比classInstance.value更不可讀; – anomeric

回答

3

編譯器在這裏做些什麼來幫助保持函數調用不會增加額外的週期嗎?

是的。

熱點JIT編譯器將內聯短方法,並且一個簡單的getter或setter足夠短以允許它。內聯方法體擺脫了參數程序集和方法調用的開銷,並允許在調用方法的上下文中進行進一步的本地優化。

最終的結果是,使用getter和setter方法是不是在現代JVM(TM)性能達到

(一些早期的Android編譯器並沒有做到這一點,但是這已修正。)

+0

謝謝你真正解決這個問題。 – anomeric

0

我不知道Java是否做了這樣的事情,但C++可以內聯這樣的東西。

我也喜歡使用getters和setter,但它們比普通變量慢。

因此,如果您要創建一個API並選擇公共變量,並且可讀性不是那麼重要,那就和getter和setters一起去吧。

+0

不可能說getter比較慢,JMV在代碼高度執行時優化 –

+0

我曾經做過一個實驗來發現,這表明getter和setter比較慢。但是這可能已經有所改善。 – Professor901

+1

如果您的實驗顯示任何最新版本的Java都有可測量的差異,那麼基準測試技術很可能存在問題。 –

-2

我會說有時候getter或setter做的不僅僅是返回/設置一個值。內部實現不應該暴露給用戶。你將不得不使用instance.attribut或sometime instance.getAttribut(),這是不是你想要做的。

+0

「與除指定和返回請求值之外沒有功能的獲取器和設置器有關」 – anomeric