检查是否设置了哪个算法更快?

时间:2011-09-10 20:22:55

标签: java algorithm optimization bit-manipulation

我正在制作一个游戏,其中我将大量数据存储在一个整数或长整数中,因为我将拥有大量数据。出于性能原因,我不想使用整个类,并且不需要它们。我找到了两种从整数中检索一位的方法。我想知道是否有人知道我应该使用哪一个或哪一个更快。

方法:

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

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

3 个答案:

答案 0 :(得分:16)

你正在测试的位置比你测试的int“更恒定”。因此,您可以为该位创建常量,这意味着您只需要进行一次换档。例如:

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和比较),而不是三个(移位,AND和比较)。

更重要的是(正如评论中所指出的)而不是速度增益,它也使得你更清楚地使用每个位,因此代码更容易阅读。

答案 1 :(得分:5)

这取决于您的硬件和编译器。如果没有实际运行任何时间试验,我认为没有人能说哪个更好。

此外,我不担心这样的事情,除非你有确凿的证据表明这段代码对时间至关重要,你必须优化它。花时间微优化这样的代码不太可能有效,除非你知道这是一个性能瓶颈,如果你不能通过优化代码的其他部分来获得更多的奖励性能,我会非常惊讶。尝试分析代码以查看真正的瓶颈,然后优化这些部分。

答案 2 :(得分:3)

几乎肯定没有区别。

但是,对于您的平台来说,唯一可以确定的方法是对它们进行分析。您需要测量循环中大量数字的时间(如100e6),以便最大限度地减少测量误差。