哪个更快(掩码>> i& 1)或(掩码& 1<< i< i)?

时间:2011-03-25 17:28:37

标签: c++ c bitwise-operators

在我的代码中,我必须选择这两个表达式中的一个(其中mask和i非常数整数-1 < i < (sizeof(int) << 3) + 1)。我不认为这会使我的程序的性能更好或更差,但对我来说这非常有趣。你知道哪个更好,为什么?

8 个答案:

答案 0 :(得分:5)

首先,每当你发现自己问“哪个更快”时,你的第一反应应该是为自己描绘,测量和发现。

其次,这是一个非常小的计算,它几乎肯定与您的应用程序的性能无关。

第三,这两者很可能在表现上相同。

答案 1 :(得分:3)

使用其中任何一个,让你的编译器根据需要对其进行优化。

答案 2 :(得分:3)

C表达式不能“更快”或“更慢”,因为CPU无法直接评估它们。

哪一个“更快”取决于您的编译器能够为这两个表达式生成的机器代码。如果你的编译器足够聪明,可以在你的上下文中实现同样的事情(例如,你只是将结果与零进行比较),它可能会为两个变体生成相同的代码,这意味着它们将同样快速。在这种情况下,很可能生成的机器代码甚至不会远程地类似于原始表达式中的操作序列(即,没有移位和/或没有按位和 - )。如果你在这里尝试做的只是测试一位的值,那么除了shift-and-bitwise和combination之外还有其他方法可以做到这一点。许多“其他方式”在C中无法表达。您不能在C中使用它们,而编译器可以在机器代码中使用它们。

例如,x86 CPU有一个专用的位测试指令BT,它通过数字提取特定位的值。因此,智能编译器可能只生成类似

的内容
MOV eax, i
BT  mask, eax
...

对于你的两个表达式(假设它更有效,我不确定)。

答案 3 :(得分:2)

如果“i”是编译时常量,那么第二个将执行更少的指令 - 1&lt;&lt;我将在编译时计算。否则我会想象他们会是一样的。

答案 4 :(得分:2)

完全取决于值maski的来源以及运行程序的体系结构。在它们实际等效的情况下,也没有什么可以阻止编译器将一个转换为另一个。

简而言之,除非你有迹象表明这是总执行时间的一小部分,否则不值得担心。

答案 5 :(得分:1)

两者都不太可能更快。如果你真的好奇,编译一个简单的程序,同时执行这两个程序,反汇编,并查看生成的指令。

以下是如何做到这一点:

gcc -O0 -g main.c -o main
objdump -d main | less

答案 6 :(得分:0)

您可以检查汇编输出,然后查找每条指令需要多少个时钟周期。

但是在99.9999999%的节目中,它不会产生任何差别。

答案 7 :(得分:0)

2个表达式在逻辑上并不相同,性能不是您的关注!

如果您关注性能,请编写一个循环来完成每个1000万的测量。

编辑:你在我的回复之后编辑了这个问题...所以请忽略我的答案,因为约束改变了事情。