位操作(C ++)

时间:2011-02-28 23:07:56

标签: c++ performance bits

最近我对访问提出了一个问题 - 我被要求比较性能方面的按位操作。

同样,简要介绍一下不同位操作的性能。

  

我想这个问题可能非常普遍且非常适合机器,但我也认为应该有一些关于此的一般规则,你必须提及(我没有:)。

那么 - 你会回答什么?

我可能也应该说,比较它们在C (或C ++,无论如何)中的性能可能是一个好主意,因为我认为这些语言为编译器提供了更多的空间来执行与位相关的优化。

谢谢。


好的,完整的问题背景。

采访有几个部分,其中一些真的是小菜一碟,有些是噩梦。与位相关的部分很难,包括以下问题:

  • 浮点数规范,floatdouble

  • 快速float - > int次转化(如果您知道范围,则更快一次)

这些并不是很难,但作为这个与位相关的部分中的最后一个问题,我被要求列举我所知道的位操作并比较它们的性能。

我回答了一些不太像描述性的东西,比如“它的架构,编译器,......具体,它实际上并不重要,按位已经很低级了”,但我猜这个答案很糟糕。

2 个答案:

答案 0 :(得分:12)

我认为它们意味着将位操作与算术等价物进行比较。

例如,“a = (a>>1)a = (a / 2)更快?”

在许多情况下,像这样的简单操作(由于各种原因,包括软件和硬件优化,流水线操作,缓存等)实际上需要1个CPU周期,所以在现代处理器上你不太可能看到差异 - 但如果它们运行通过多个ALU并行执行许多指令,如果混合算术运算和按位运算,您仍可以更好地利用CPU的并行路径。如果你用更高级别的语言编写,那么编译器很可能会优化你的代码以使用更好的形式,所以无论你编写代码的方式如何,你都会看到相同的性能!

但是,有些情况下,按位运算可能比简单的算术/逻辑快得多 - 例如,您可以通过几个按位运算将某些操作应用于32位或64位值中的所有字节(有效地同时处理所有字节),否则将需要大量循环并比较逻辑以逐步进行。有关可以实现的一些很好的示例,请参阅here。在这些情况下,通常会获得显着的性能优势。 (虽然确切的增益很大程度上取决于你所针对的CPU)

(或者,它们可能只是意味着“移位操作比XOR更快”,在这种情况下,现代处理器在大多数情况下答案可能是“不” - 大多数按位操作都很快。但这将是一个要问的是毫无意义的问题......)

答案 1 :(得分:3)

这是一个非常奇怪的问题。首先,因为语言应该是无关紧要的 - 只要你用编译语言编写,任何按位操作都应该编译成单个汇编指令,即使是最简单的汇编语言。 / p>

其次,一旦单个汇编指令到达处理器,它应该在一个周期内进行评估 - 按位的东西就是这么简单。空间匮乏的处理器可能会在几个周期内实现移位操作(它们需要比其他处理器快得多的电路),但在任何现代机器上这似乎都不太可能,所以即使是单周期的转换也是如此指令。

以下是Wikipedia对此事所说的内容:

  

按位操作在一个或上运行   更多位模式或二进制数字   在他们各自的位的水平。   在大多数较旧的微处理器上,按位   操作比稍快   加法和减法运算   并且通常明显快于   乘法和除法   操作。在现代建筑上,   这不是按位的情况   操作通常是一样的   速度加法(虽然仍然更快   而不是乘法)。

希望这有帮助!