【发布时间】:2020-01-06 15:45:34
【问题描述】:
有人告诉我,基于位掩码的检查比比较数字更有效。这是真的吗?
“基于位掩码”检查:
if (val & IMPORTANT_BIT)
...
数字比较:
if (val == IMPORTANT_VAL)
...
在这两种情况下,我都觉得无论如何都必须从内存中提取val。那么为什么位掩码会更有效呢?编译器是否对位掩码做了一些花哨的事情?
【问题讨论】:
-
我猜这可能取决于编译器/CPU,尽管我希望在大多数情况下它们在性能方面非常相似。当多个标志(位)组合成一个整数(字节、短、长)时,使用
&进行位掩码检查非常常见,因为这样可以轻松检查是否设置了单个位。 -
您可以test this yourself。在这里,第一种方法需要 3 条指令,但第二种方法 - 只有一个
-
即使假设
IMPORTANT_BIT和IMPORTANT_VAL相同,这两个测试也完全不同。如果重要位的值为1,则第一个测试检查val中的数字是否为奇数,而第二个测试是否等于1。这些完全不同,以至于比较是无关紧要的。我选择了最简单的情况,但无论IMPORTANT_BIT的实际值如何,这个概念都适用。 -
IMPORTANT_*的值是多少,val的可能值是多少?如果他们没有执行相同的操作,那么比较是没有意义的。无论如何,您不会注意到 ALU 中这种微不足道的操作有什么不同。 -
它们在语义上做不同的事情,所以它是学术性的并且依赖于机器的指令集。这不太可能是一个有价值的优化,大多数编译器都能够提供优化,这些优化将淹没从这种“微优化”中获得的任何可能的好处。专注于高效的软件设计和选择合适的数据结构,让编译器处理这种依赖机器的东西。
标签: c performance compiler-optimization