为了账号安全,请及时绑定邮箱和手机立即绑定

是不是比<=更快?

是不是比<=更快?

C++
智慧大石 2019-07-09 16:14:26
是不是比<=更快?我在读一本书,作者说if( a < 901 )比if( a <= 900 ).不完全像这个简单的例子,但是循环复杂的代码有轻微的性能变化。我认为这必须对生成的机器代码做一些操作,以防它是真的。
查看完整描述

3 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

历史上(我们说的是20世纪80年代和90年代初),一些这是正确的架构。根本问题是,整数比较本质上是通过整数减法实现的。这就产生了以下情况。

Comparison     Subtraction----------     -----------A < B      --> A - B < 0A = B      --> A - B = 0A > B      --> A - B > 0

现在,当A < B减法必须借用一个高位才能使减法正确,就像你在用手加减时进行和借入一样。这个“借来的”位通常被称为进位位并且可以通过分支指令进行测试。第二个比特称为零位如果减法是相同的,这就意味着相等。

通常至少有两个条件分支指令,一个在进位上分支,一个在零位上。

现在,为了了解问题的核心,让我们扩展上一个表,包括进位和零位结果。

Comparison     Subtraction  Carry Bit  Zero Bit----------     -----------  ---------  --------A < B      --> A - B < 0    0          0A = B      --> A - B = 0    1          1A > B      --> A - B > 0    1          0

所以,实现一个分支A < B可以在一条指令中完成,因为进位是清楚的。在这种情况下,就是说,

;; Implementation of "if (A < B) goto address;"cmp  A, B          ;; compare A to B
bcz  address       ;; Branch if Carry is Zero to the new address

但是,如果我们想做一个小于或等于的比较,我们需要对零标志进行额外的检查,以捕获相等的情况。

;; Implementation of "if (A <= B) goto address;"cmp A, B           ;; compare A to B
bcz address        ;; branch if A < B
bzs address        ;; also, Branch if the Zero bit is Set

因此,在某些机器上,使用“小于”的比较强权存钱单机指令..这在亚兆赫处理器速度和1:1 CPU与内存速度比的时代是相关的,但它在今天几乎完全无关紧要。


查看完整回答
反对 回复 2019-07-09
?
Helenr

TA贡献1780条经验 获得超4个赞

假设我们讨论的是内部整数类型,就不可能有一种方法比另一种更快。显然它们在语义上是相同的。他们都要求编译器做同样的事情。只有严重损坏的编译器才会为其中之一生成劣等代码。

如果有什么平台<<=对于简单整数类型,编译器应该转换<=<常量。任何编译器,如果不是,都会是一个糟糕的编译器(对于那个平台来说)。


查看完整回答
反对 回复 2019-07-09
  • 3 回答
  • 0 关注
  • 295 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信