2010-11-01 48 views
3

我知道規則#1的優化是:不要這樣做!但我認爲這是一個簡單的問題,如果我現在開始使用更快的方法,那麼當完成時我可以節省大量的CPU時間。優化:訪問字段與方法

我正在做一個RPG遊戲,讓我們說這是一個自定義類的一部分:

public class Baddie{ 

    int health; 
    int magic; 

    public Baddie(int health, int magic){ 
     this.health = health; 
     this.magic = magic; 
    } 

    public int getHealth(){ 
     return health; 
    } 

現在,回答我的問題可能是「沒有區別」,這就是罰款與我..我只是想知道。使用現場訪問獲取Baddie健康狀況的速度更快嗎:

//Somewhere in the main thread, I get an instance of Baddie.. 
Baddie b = getScaryBadGuy(); 
int baddieHealth = b.health; 

還是使用返回方法更快?

int baddieHealth = b.getHealth(); 

回答

5

複製和粘貼從Designing for Performance

避免內部getter/setter方法

在像C++是 常見的做法是用干將本地語言(例如我 = getCount())而不是直接訪問字段(i = mCount)。這是 C++的一個很好的習慣,因爲 編譯器通常可以內嵌 的訪問權限,如果需要限制或調試字段的訪問,你可以隨時添加 的代碼。

在Android上,這是一個壞主意。 虛擬方法調用比較昂貴, 比實例字段 查找要多得多。遵循 通用面向對象編程 的做法是合理的,並且在公共接口中有獲取者和設置者 ,但在 類中,您應該始終直接訪問 字段。

沒有JIT,直接字段訪問是 約比調用 平凡的getter快3倍。通過JIT(其中 直接字段訪問與訪問本地的便宜,如 一樣),直接字段 訪問比調用平凡的獲取器的約快7倍。在Froyo中,這是 爲真,但當JIT內聯吸氣 方法時,未來會改進 。

+0

哦!我以爲我讀得很透徹..不要猜測!感謝你的回答! – Snailer 2010-11-01 17:51:24

0

如果可以的話,編譯器會進行優化。這是過早優化的一個完美例子。在代碼中使用任何有意義的東西。不要擔心「儲蓄週期」。 2-3個週期可能會或可能不會節省超過任何其他操作所需的數百萬個週期。

+0

雖然答案說使用字段訪問,但我相信你也是對的。我想,這是一個微不足道的問題。這不像現在手機無法處理的幾種方法:P我會盡量不要擔心優化。 – Snailer 2010-11-01 17:53:54

0

海事組織這是一個比優化問題更多的設計問題。我建議不要編寫/生成任何getter或setter,除非你真的需要從課堂外訪問它們。這趨於保持儘可能低的耦合。

或者讓這些getters/setters默認爲私有會有相同的結果,但它更多的代碼沒有真正的好處。

1

表現總是相對的。以百分比或因素來考慮通常會更好。如果某些事情需要一微秒,那可能是很多,也可能沒有。這取決於您需要每秒執行多少次。這是不成熟的優化被忽視的主要原因,它是在不知道是否存在問題的情況下完成的。