2011-09-10 36 views
7

我正在製作一個遊戲,其中我將大量數據存儲在一個整數或長整數中,因爲我將擁有大量的數據。我不想爲了性能的原因使用整個類,而且也不需要它們。我發現了兩種方法從一個整數中檢索一個位。我想知道是否有人知道我應該使用哪一個或哪一個更快。哪個算法檢查比特是否設置更快?

的方法:

return (integer & (1 << bit)) != 0;

return (integer >> bit& 0x1) == 1;

+23

不成熟的優化是魔鬼玩物 – austinbv

+4

完美的微基準測試。以100萬的循環運行並計時。 – Oded

+0

我幾乎完全確定第二個是簡單_wrong_,不管它是否更快或不... – bdonlan

回答

16

機會是你正在測試的「更恆定」比你正在測試的整數。因此,您可以爲該位設置常量,這意味着您只需進行一次移位。例如:

static final int LEFT_WALL = 1 << 1; 
static final int RIGHT_WALL = 1 << 2; 
static final int BOTTOM_WALL = 1 << 3; 
static final int TOP_WALL = 1 << 4; 
在循環

然後,你只是檢查

if ((integer & LEFT_WALL) != 0) 
    // left wall collision 
if ((integer & RIGHT_WALL) != 0) 
    // right wall collision 
... 

所以你只能做兩個操作(按位與和比較)的循環,而不是三個(移位, AND和比較)。

更重要的是(正如在評論中指出的那樣)而不是速度增益,它也使得它更清楚你使用的每一點,因此代碼更易於閱讀。

+6

即使比保存操作更好,我也可以輕鬆閱讀並理解它。 – tvanfosson

+0

awsome的想法。我在我的程序中也同樣擁有差不多相同的最終變數。順便說一句,大多數人都說這不是一個非常重要的optomization,但在某些時候,我將不得不運行這個約2400萬次大聲笑 –

+1

@stas是的,你可以節省一個這樣的轉變,這可能與μop融合和合作成本大概是一個週期的一半。因此,運行這個24 * 10^6次可以爲3ghz CPU節省大約1200萬個週期或大約4ms。那大大節省了。 – Voo

5

這取決於具體的實現依賴於你的硬件和編譯器。在沒有實際運行任何時間試驗的情況下,我認爲任何人都不能說哪個會更好。除非您有明確的證據表明此代碼如此重要以至於您必須對其進行優化,否則我不會擔心類似的情況。花費時間微型優化這樣的代碼不太可能是有效的,除非你知道這是一個性能瓶頸,如果你不能通過優化代碼的其他部分來獲得更多的獎勵性能,我會感到非常驚訝。嘗試分析代碼以查看真正的瓶頸,然後優化這些部分。

3

這幾乎肯定沒有區別。

但是,對於您的平臺而言,唯一確定的方法就是將它們分別處理。爲了儘量減少測量誤差,您需要在循環中測量大數的時間(如100e6)。

相關問題