最近面试时遇到一个问题——我被要求比较按位运算的性能。
比如,简单描述一下不同位操作的性能。
我想这个问题可能非常普遍并且非常特定于机器,但我也认为应该有一些关于这个的一般规则,你必须提到(我没有:)。
那么 - 你会回答什么?
我可能还应该说,比较它们在 C 中的性能可能是个好主意(或 C++,无论如何),因为我假设这些语言为编译器提供了更多空间来执行与位相关的优化。
谢谢。
好的,完整的问题背景。
面试有几个部分,有些确实是小菜一碟,有些则是一场噩梦。与位相关的部分有点困难,包括以下问题:
这些并不是很难,但作为与位相关的部分中的最后一个问题,我被要求枚举我所知道的位操作并比较它们的性能。
我回答了一些不太具有描述性的问题,比如“它是架构、编译器……特定的,实际上并不重要,按位已经是相当低级的了”,但我想这个答案很糟糕。
我想他们的意思是将位运算与算术等价物进行比较。
例如,“是a = (a>>1)
比...快a = (a / 2)
?"
在许多情况下,像这样的简单操作(由于各种原因,包括软件和硬件优化、流水线、缓存等)将有效地占用 1 个 CPU 周期,因此在现代处理器上,您不太可能看到差异 - 但如果它们在如果您通过多个 ALU 进行并行,那么如果您混合算术和按位运算,您仍然可以从更好地利用 CPU 并行路径中受益。如果您使用高级语言编写,那么编译器很可能会优化您的代码以使用更好的形式,因此无论您以哪种方式编写代码,您都会看到相同的性能!
但是,在某些情况下,按位运算可能比简单的算术/逻辑要快得多 - 例如,您可以通过一些按位运算(有效处理所有数据)对 32 位或 64 位值中的所有字节应用某些运算。字节同时),否则将需要大量循环和比较逻辑来增量执行。看here http://www.graphics.stanford.edu/~seander/bithacks.html一些可以实现的伟大例子。在这些情况下,通常可以获得显着的性能优势。 (尽管确切的增益很大程度上取决于您的目标 CPU)
(或者,他们可能只是意味着“移位操作比 XOR 更快”,在这种情况下,对于现代处理器,大多数情况下答案可能是“否” - 大多数按位操作很快。但这将是一个毫无意义的问题去问...)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)