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

Sta*_*aro 7 java algorithm optimization bit-manipulation

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

方法:

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

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

Pau*_*lin 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;
Run Code Online (Sandbox Code Playgroud)

然后在你的循环中,你只是检查

if ((integer & LEFT_WALL) != 0)
  // left wall collision
if ((integer & RIGHT_WALL) != 0)
  // right wall collision
...
Run Code Online (Sandbox Code Playgroud)

因此,您只在循环中执行两个操作(按位AND和比较),而不是三个(移位,AND和比较).

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

  • 甚至比保存操作更好,我可以轻松阅读并理解它. (6认同)

tem*_*def 5

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

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