if else赋值与?:赋值效率哪种更优?

shi3590 2010-10-20 10:52:23
以下代码都能达到同样的目的,但是两种写法对效率来说,哪种更优?

//code:1
int main(int argc, char **argv)
{
int i=1;
int j=0;
int s;
s=i>j?i:j;
return 0;
}


//code:2
int main(int argc, char **argv)
{
int i=1;
int j=0;
int s;
if (i>j) s=i;
else s=j; //比code:1多1行
return 0;
}

一起看看汇编:

5781: int i=1;
004104E8 mov dword ptr [ebp-4],1
5782: int j=0;
004104EF mov dword ptr [ebp-8],0
5783: int s;
5784: s=i>j?i:j;
004104F6 mov eax,dword ptr [ebp-4]
004104F9 cmp eax,dword ptr [ebp-8]
004104FC jle main+36h (00410506)
004104FE mov ecx,dword ptr [ebp-4]
00410501 mov dword ptr [ebp-10h],ecx
00410504 jmp main+3Ch (0041050c)
00410506 mov edx,dword ptr [ebp-8]
00410509 mov dword ptr [ebp-10h],edx
0041050C mov eax,dword ptr [ebp-10h]
0041050F mov dword ptr [ebp-0Ch],eax
5785: return 0;
00410512 xor eax,eax
5786: }


5789: int i=1;
004104E8 mov dword ptr [ebp-4],1
5790: int j=0;
004104EF mov dword ptr [ebp-8],0
5791: int s;
5792: if (i>j) s=i;
004104F6 mov eax,dword ptr [ebp-4]
004104F9 cmp eax,dword ptr [ebp-8]
004104FC jle main+36h (00410506)
004104FE mov ecx,dword ptr [ebp-4]
00410501 mov dword ptr [ebp-0Ch],ecx
5793: else s=j;
00410504 jmp main+3Ch (0041050c)
00410506 mov edx,dword ptr [ebp-8]
00410509 mov dword ptr [ebp-0Ch],edx
5794: return 0;
0041050C xor eax,eax
5795: }

大家怎么看?
...全文
561 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
canshui 2010-10-20
  • 打赏
  • 举报
回复
纠结?:与if...else的效率!嗯,lz很强大啊……

既然,lz都把汇编写出来了,你的汇编代码应该比 ?:与if...else高吧……,你就用汇编写去吧!甚至0与1更快,你写吧……

我觉着纠结效率有意义的地方,应该体现在 高超的算法 上。而不是 ?: 与if...else……
memoleak 2010-10-20
  • 打赏
  • 举报
回复
首先,强烈鄙视一下楼主的编译器.能把?:编译得比if-else更低效.
如果单考虑效率,一般来讲,使用?:比if-else更有优势.原因是:
1.编译器对?:的处理一般是先赋值,再比较;而对if-else的处理是先比较后赋值.
2.某些处理器有三目运算指令或者条件赋值指令,这样?:或许只要1条指令或者2条指令就可以了,这个效率是if-else远远不能比的
某某9 2010-10-20
  • 打赏
  • 举报
回复
效率不知道
但是数据简单时还是用?:,可以嵌套进别的语句
数据复杂时,用if else,易读易理解。
Jekhn 2010-10-20
  • 打赏
  • 举报
回复
注重效率是很有必要的,特别是在循环里面,不过编译器反汇编出来的还可以再优化一下,cmp只改变标志位,所以没有必要重复赋值了。

_asm
{
mov eax,dword ptr [ebp-4]
mov edx,dword ptr [ebp-8]
cmp eax,edx
jle aa
mov dword ptr [ebp-0Ch],eax
jmp bb
aa:
mov dword ptr [ebp-0Ch],edx
bb:
}
时间一粒 2010-10-20
  • 打赏
  • 举报
回复
这个是应需求而用的吧。简单时用?:还是好的,如果复杂了,用起来就不行了
liutengfeigo 2010-10-20
  • 打赏
  • 举报
回复
Keep It Sample and Stupid.
zenny_chen 2010-10-20
  • 打赏
  • 举报
回复
楼主啊,你这编译器的优化能力也忒矬了吧。
当然,本人提供最高效的:

int main(int argc, char **argv)
{
int i=1;
int j=0;
int s = j;
if(i>j)
s = i;
return 0;
}

dutor 2010-10-20
  • 打赏
  • 举报
回复
上面代码可以看到,不仅仅是指令数有差异,if else使用了jmp,这对现代的处理器体系来讲是不利的,它会降低指令预取的成功率,指令流水的并行度。而且当前的CPU多数都有类似cmovge这类指令。
dutor 2010-10-20
  • 打赏
  • 举报
回复

int
main()
{
int i = 1, j = 2;
int m = i > j ? i : j;
if(i > j)
m = i;
else
m = j;
return 0;
}


main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $1, -4(%ebp)
movl $2, -8(%ebp)
# ?:
movl -4(%ebp), %eax
cmpl %eax, -8(%ebp)
cmovge -8(%ebp), %eax
movl %eax, -12(%ebp)
#end :?
# if else
movl -4(%ebp), %eax
cmpl -8(%ebp), %eax
jle .L2
movl -4(%ebp), %eax
movl %eax, -12(%ebp)
jmp .L3
.L2:
movl -8(%ebp), %eax
movl %eax, -12(%ebp)
# end ifelse

.L3:
movl $0, %eax
leave
ret

greyillusion 2010-10-20
  • 打赏
  • 举报
回复
土人表示例子里没看出来效率高了,还多了几条指令
mlimfx 2010-10-20
  • 打赏
  • 举报
回复
如果只考虑效率的话,if...else 较高,但极细微;个人还是从可读角度更提倡if .. else
dutor 2010-10-20
  • 打赏
  • 举报
回复
如果别人告诉你?:效率高,而你认为效率不是最重要的,所以就是不用?:吗?
对,有时候考虑到算法复杂度、开发周期以及该代码模块的重要程度,效率可能不是最重要的。但这代表着效率不重要吗?
dutor 2010-10-20
  • 打赏
  • 举报
回复
在一个数以M记的循环中,在一个反复被调用的函数中,三条“指令”的差别足以让程序性能得到不小的提升。
?:不仅效率稍高,而且也不失可读性,能用的地方尽量用。细微之处见功力。
dengqibin 2010-10-20
  • 打赏
  • 举报
回复
这解法不错[Quote=引用 5 楼 zhao4zhong1 的回复:]
KISS:
Keep It Sample and Stupid.
[/Quote]
赵4老师 2010-10-20
  • 打赏
  • 举报
回复
KISS:
Keep It Sample and Stupid.
shi3590 2010-10-20
  • 打赏
  • 举报
回复
只是单纯的想知道?:的赋值是不是双刃剑,并没有其他意思。
BT六眼飞鱼 2010-10-20
  • 打赏
  • 举报
回复
关注效率是没错,不过扣这种问题个人认为没必要~呵呵
justkk 2010-10-20
  • 打赏
  • 举报
回复
纠结这个的效率没啥意义吧
taodm 2010-10-20
  • 打赏
  • 举报
回复
你是不是编程只关心“效率”?
Jekhn 2010-10-20
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 zenny_chen 的回复:]

引用 16 楼 jekhn 的回复:

注重效率是很有必要的,特别是在循环里面,不过编译器反汇编出来的还可以再优化一下,cmp只改变标志位,所以没有必要重复赋值了。
Assembly code

_asm
{
mov eax,dword ptr [ebp-4]
mov edx,dword ptr [ebp-8]
……

可以这么来,再省去一条……
[/Quote]
谢谢高手指教,呵呵。。。
加载更多回复(16)

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧