在C中,会不会比b == 0xff更快?~b?

时间:2010-05-04 15:54:54

标签: c optimization comparison bits

从很久以前,我有一个记忆,我一直坚持认为与零的比较比任何其他值都快(ahem Z80)。

在我编写的一些C代码中,我想跳过设置了所有位的值。目前,这些值的类型为char,但可能会发生变化。我有两种不同的替代方法来执行测试:

if (!~b)
    /* skip */

if (b == 0xff)
    /* skip */

除了后者假设b是一个8位字符,而前者没有,前者会因为旧的比较零优化技巧而变得更快,或者今天的CPU是否超出这种情况?

4 个答案:

答案 0 :(得分:10)

如果速度更快,编译器会替换它。

通常,您不能编写C比编译器可以优化它更好。无论如何它都是建筑特定的。

简而言之,不要担心,除非亚微纳秒非常重要

答案 1 :(得分:7)

我记得在我的架构课程中,我相信它们应该同样快。两者都有2条指令。

第一个例子     1.将b否定为临时寄存器     2.比较温度寄存器等于0

第二个例子     1.将b中的0xff减去临时寄存器     2.比较温度寄存器等于0

这些基本相同,而且,即使您的特定架构需要比这更多或更少,它真的值得纳秒的一小部分吗?花了几分钟才回答这个问题。

答案 2 :(得分:3)

我会说, CPU 并不是因为它是编译器而超出这些技巧。

今天的的CPU是,不仅仅是简单的技巧,它可以提供额外的时钟速度或两倍的速度。即使您每秒执行100,000次,我们仍然只是谈论单核3Ghz计算机上的速度提高0.00003秒 - 不用担心这样的事情。

答案 3 :(得分:2)

使用对于维护代码的人来说更容易理解的那个。如果您有一个成功的产品,软件的大部分费用都在维护。如果你写了神秘的代码,你就会增加这笔费用。如果您没有成功的产品,那没关系,因为没有人必须维护它。我一直处在这样的情况下,我必须保存每一个字节,并且不得不求助于你给的那个技巧,但我只是作为最后的手段。