位操作(C++)

Yip*_*Yay 9 c++ performance bits

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

比如,简要描述不同位操作的性能.

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

那么 - 你会回答什么?

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

谢谢.


好的,完整的问题背景.

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

  • 浮点数规格float,double

  • 快速float- > int转换(如果你知道范围,甚至更快)

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

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

Jas*_*ams 12

我想他们的意思是将位操作与算术等价物进行比较.

例如," a = (a>>1)a = (a / 2)哪个更快?"

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

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

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