标题: C语言语句问题 if(x<=y) 和if(x<y||x==y) 一样吗 执行效率谁快 [打印本页]

作者: 李冬    时间: 2022-9-8 17:01
标题: C语言语句问题 if(x<=y) 和if(x<y||x==y) 一样吗 执行效率谁快
if(x<=y)  和if(x<y||x==y) 一样吗 执行效率谁快

作者: cnos    时间: 2022-9-8 17:28
     4: if(x<=y)
C:0x000F    E508     MOV      A,0x08
C:0x0011    D3       SETB     C
C:0x0012    9509     SUBB     A,0x09
C:0x0014    5003     JNC      C:0019
     5: {
     6:         z=1;
C:0x0016    750A01   MOV      0x0A,#0x01
     7: }        


     8: if(x<y||x==y)
C:0x0003    E508     MOV      A,0x08
C:0x0005    C3       CLR      C
C:0x0006    9509     SUBB     A,0x09
C:0x0008    4005     JC       C:000F
C:0x000A    E508     MOV      A,0x08
C:0x000C    B50903   CJNE     A,0x09,C:0012
     9: {
    10:         z=1;
C:0x000F    750A01   MOV      0x0A,#0x01
    11: }


显然,if(x<=y) 这个写法胜出。
作者: robinsonlin    时间: 2022-9-8 17:37
C语言编译的时候,会自己优化的。  执行效率,主要还是要看你的函数嵌套深度,以及for循环的使用频率。
作者: Hephaestus    时间: 2022-9-8 18:19
cnos 发表于 2022-9-8 17:28
4: if(x

换个优化等级就不是这个结果了。
作者: XCYYLX    时间: 2022-9-8 19:33
if(x<=y)这个更快,更好,老手都这样用
作者: 一事无成    时间: 2022-9-8 21:35
现在优化后应该是一样的,不过编译器不一样结果也可能不一样,要看汇编代码
作者: xianfajushi    时间: 2022-9-10 10:05
基本一样,不要看汇编语句多寡比较,要实际循环计数时间比较才得出结论,比如a>b只执行一次而a>=b则执行2次,因此慎用有2次的运算符,有时>=或<=可以化为>或<的运算优化。
作者: 188610329    时间: 2022-9-10 14:10
xianfajushi 发表于 2022-9-10 10:05
基本一样,不要看汇编语句多寡比较,要实际循环计数时间比较才得出结论,比如a>b只执行一次而a>=b则执行2次 ...

a>b,就是b-a 是否借位,借位为真,不借位为假。
a>=b,就是a-b 是否借位,不借位为真,借位为假。两者都是一次减法运算,和一次借位标志判断。本质上是一样的执行量,看编译器的“聪明”程度了。
作者: frank_tw    时间: 2022-9-10 20:30
if(x<=y)快,看编译汇编代码
作者: Hephaestus    时间: 2022-9-11 03:42
一事无成 发表于 2022-9-8 21:35
现在优化后应该是一样的,不过编译器不一样结果也可能不一样,要看汇编代码

然而我用RVMDK自带的v5、v6两种编译器,以及IAR EWARM 8.22一共三种编译器,测试了所有的优化等级,其输出的ARM汇编代码均与沙发的51代码类似, if(x<=y) 只做了做了一次比较,而if(x<y||x==y)忠实的做了两次比较。

显然编译器认为 if(x<=y) 和if(x<y||x==y) 是两种完全不同的逻辑,不能在优化中合并第二种,具体的逻辑思路我也是百撕不得骑姐,大家可以畅所欲言的讨论下。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1