从很久以前,我有一个记忆,我一直坚持认为与零的比较比任何其他值都快(ahem Z80)。
在我编写的一些C代码中,我想跳过设置了所有位的值。目前,这些值的类型为char
,但可能会发生变化。我有两种不同的替代方法来执行测试:
if (!~b)
/* skip */
和
if (b == 0xff)
/* skip */
除了后者假设b是一个8位字符,而前者没有,前者会因为旧的比较零优化技巧而变得更快,或者今天的CPU是否超出这种情况?
答案 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)
使用对于维护代码的人来说更容易理解的那个。如果您有一个成功的产品,软件的大部分费用都在维护。如果你写了神秘的代码,你就会增加这笔费用。如果您没有成功的产品,那没关系,因为没有人必须维护它。我一直处在这样的情况下,我必须保存每一个字节,并且不得不求助于你给的那个技巧,但我只是作为最后的手段。