是否可以删除此条件语句?

时间:2017-06-27 16:19:05

标签: c++ performance bit-manipulation

我为一个简单的游戏编写了一个解算器,当我描述我的代码时,这些行占用了40%的CPU时间(在针对Release版本运行时通过Visual Studio分析器)。

unsigned int notVisited, move; // initialized outside of this code
bool pathFree = (notVisited & move) == move;
if (pathFree) successors |= move;

我怀疑实际减速是该行下面的分支,并且使用优化进行编译会导致它找到错误的行。所有这些都发生在每个函数调用运行大约10次的循环中。是否有一些神奇的东西能够在不需要分支的情况下执行上述行?

2 个答案:

答案 0 :(得分:5)

这可能呢?

successors |= (move & -((int) pathFree));

如果pathFree为false,(int) pathFree为0,则整个右侧为0,|=不执行任何操作。

如果pathFree为真,则(int) pathFree为1,否定为-1,因此所有位均为1,因此整个右侧的计算结果为move

但是,我怀疑它的速度更快。在这两种情况下,您最终都会进行内存写入,如果条件为假,则可以避免以前的情况。

答案 1 :(得分:2)

令人遗憾的是,在您比较代码和建议版本的汇编输出,编译器及其设置以及所有周围代码之前,此处给出的任何答案都不会对您有任何实际意义。

从代码简洁的角度讲,我喜欢the comment by Pete Becker