是不是比<=更快?

是不是比<=更快?

我在读一本书,作者说if( a < 901 )if( a <= 900 ).

不完全像这个简单的例子,但是循环复杂的代码有轻微的性能变化。我认为这必须对生成的机器代码做一些操作,以防它是真的。


智慧大石
浏览 296回答 3
3回答

汪汪一只猫

历史上(我们说的是20世纪80年代和90年代初),一些这是正确的架构。根本问题是,整数比较本质上是通过整数减法实现的。这就产生了以下情况。Comparison&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subtraction----------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------A&nbsp;<&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;<&nbsp;0A&nbsp;=&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;=&nbsp;0A&nbsp;>&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;>&nbsp;0现在,当A < B减法必须借用一个高位才能使减法正确,就像你在用手加减时进行和借入一样。这个“借来的”位通常被称为进位位并且可以通过分支指令进行测试。第二个比特称为零位如果减法是相同的,这就意味着相等。通常至少有两个条件分支指令,一个在进位上分支,一个在零位上。现在,为了了解问题的核心,让我们扩展上一个表,包括进位和零位结果。Comparison&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Subtraction&nbsp;&nbsp;Carry&nbsp;Bit&nbsp;&nbsp;Zero&nbsp;Bit----------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-----------&nbsp;&nbsp;---------&nbsp;&nbsp;--------A&nbsp;<&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;<&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0A&nbsp;=&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;=&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1A&nbsp;>&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-->&nbsp;A&nbsp;-&nbsp;B&nbsp;>&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0所以,实现一个分支A < B可以在一条指令中完成,因为进位是清楚的。只在这种情况下,就是说,;;&nbsp;Implementation&nbsp;of&nbsp;"if&nbsp;(A&nbsp;<&nbsp;B)&nbsp;goto&nbsp;address;"cmp&nbsp;&nbsp;A,&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;compare&nbsp;A&nbsp;to&nbsp;B bcz&nbsp;&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;Branch&nbsp;if&nbsp;Carry&nbsp;is&nbsp;Zero&nbsp;to&nbsp;the&nbsp;new&nbsp;address但是,如果我们想做一个小于或等于的比较,我们需要对零标志进行额外的检查,以捕获相等的情况。;;&nbsp;Implementation&nbsp;of&nbsp;"if&nbsp;(A&nbsp;<=&nbsp;B)&nbsp;goto&nbsp;address;"cmp&nbsp;A,&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;compare&nbsp;A&nbsp;to&nbsp;B bcz&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;branch&nbsp;if&nbsp;A&nbsp;<&nbsp;B bzs&nbsp;address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;also,&nbsp;Branch&nbsp;if&nbsp;the&nbsp;Zero&nbsp;bit&nbsp;is&nbsp;Set因此,在某些机器上,使用“小于”的比较强权存钱单机指令..这在亚兆赫处理器速度和1:1 CPU与内存速度比的时代是相关的,但它在今天几乎完全无关紧要。

Helenr

假设我们讨论的是内部整数类型,就不可能有一种方法比另一种更快。显然它们在语义上是相同的。他们都要求编译器做同样的事情。只有严重损坏的编译器才会为其中之一生成劣等代码。如果有什么平台<比<=对于简单整数类型,编译器应该总转换<=到<常量。任何编译器,如果不是,都会是一个糟糕的编译器(对于那个平台来说)。
打开App,查看更多内容
随时随地看视频慕课网APP