9

最近我在面试中遇到了一个问题——我被要求从性能方面比较按位运算。

比如,简单介绍一下不同位操作的性能。

我想这个问题可能非常笼统且非常特定于机器,但我也认为应该有一些关于这个的一般规则,你必须提到(我没有:)。

那么——你会怎么回答?

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

谢谢你。


好的,完整的问题上下文。

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

  • 浮点数规范, float,double

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

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

我回答了一些不是真正描述性的问题,例如“它是体系结构,编译器,......具体,这实际上并不重要,按位已经非常低级”,但我想这个答案很糟糕。

4

2 回答 2

12

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

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

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

但是,在某些情况下,按位运算可能比简单的算术/逻辑快得多 - 例如,您可以通过一些按位运算(有效地处理所有同时字节),否则将需要大量循环和比较逻辑来增量执行。有关可以实现的目标的一些很好的示例,请参见此处。在这些情况下,通常可以获得显着的性能优势。(尽管确切的增益在很大程度上取决于您的目标 CPU)

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

于 2011-02-28T23:25:32.383 回答
3

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

其次,一旦单个汇编指令到达处理器,就应该在一个周期内对其进行评估——按位计算就是这么简单。空间匮乏的处理器可能会在几个周期内实现移位操作(它们需要比其他处理器更多的电路才能快速完成),但这在任何现代机器上似乎都不太可能,因此即使移位也应该是单周期指示。

以下是维基百科对此事的看法:

按位运算在一个或多个位模式或二进制数字的各个位级别上进行操作。在大多数较旧的微处理器上,按位运算比加法和减法运算稍快,通常比乘法和除法运算快得多。在现代架构中,按位运算的速度通常与加法相同(尽管仍比乘法快)。

希望这可以帮助!

于 2011-02-28T23:27:16.050 回答