我为一个简单的游戏编写了一个解算器,当我描述我的代码时,这些行占用了40%的CPU时间(在针对Release版本运行时通过Visual Studio分析器)。
unsigned int notVisited, move; // initialized outside of this code
bool pathFree = (notVisited & move) == move;
if (pathFree) successors |= move;
我怀疑实际减速是该行下面的分支,并且使用优化进行编译会导致它找到错误的行。所有这些都发生在每个函数调用运行大约10次的循环中。是否有一些神奇的东西能够在不需要分支的情况下执行上述行?
答案 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