diff = (diff > 40) ? 40 : (diff < -40) ? -40 : diff效率问题

VR_Lab 2010-08-26 11:20:23
如题,上面的改成if判断的效率高一些还是就那样的效率最高?
...全文
76 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamshuke 2010-08-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 kingbyang1 的回复:]
你这个是没用if判断的汇编吧,那用if判断的汇编呢?
[/Quote]

完全一样,但测试时注意要环境完全相同,否则由于编译器优化的原因,结果就可能不一样。比如:
...
result1 = (n1>n2)? n1:n2;
if(n1 > n2) result2 = n1; else result2 = n2;
...


...
if(n1 > n2) result2 = n1; else result2 = n2;
result1 = (n1>n2)? n1:n2;
...

只是把位置调了一下,结果就会有所不同。

另外,我上面给出的汇编代码和C++代码其实对不上,因为当时我在程序中加了其它语句,实际上是这样的:

int main(int argc, char* argv[])
{
unsigned int n1 = GetTickCount();
unsigned int n2 = GetTickCount();
unsigned int result;

result = (n1 > n2)? n1 : n2;

printf("%d", result);
return 0;
}


汇编
mov edi, dword ptr[00406000]
call edi ;调用GetTickCount()
mov esi, eax ;esi为n1
call edi ;调用GetTickCount(), eax为n2

;从这里开始,因为马上就要使用result,所以编译器把eax定义为result了
cmp esi, eax ;比较n1,n2
jbe 00401014 ;n1 <= n2时跳转(result = n2)
mov eax, esi ;没跳转,n1>n2, result = n1

;输出...
VR_Lab 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 xxd_qd 的回复:]
运行效率一样。
敲代码的效率比if else高(因为需要敲的字符少)。
别人读懂你的程序的效率比if else低。
[/Quote]
恩,当然我自己还是用if来写的,也方便自己读。但是在其他地方看到过汇编出来的代码条数用if判断的要多一些。
VR_Lab 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iamshuke 的回复:]
和if else一样
[/Quote]
但是我貌似在其他地方看到过汇编出来的代码用if判断的要多很多条。
sunlin7 2010-08-26
  • 打赏
  • 举报
回复
建议使用if形式的。
Eleven 2010-08-26
  • 打赏
  • 举报
回复
if(diff > 40)
{
diff = 40;
}
else if(diff < -40)
{
diff = -40;
}
xxd_qd 2010-08-26
  • 打赏
  • 举报
回复
运行效率一样。
敲代码的效率比if else高(因为需要敲的字符少)。
别人读懂你的程序的效率比if else低。
iamshuke 2010-08-26
  • 打赏
  • 举报
回复
和if else一样
VR_Lab 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 iamshuke 的回复:]
引用 6 楼 kingbyang1 的回复:
引用 2 楼 xxd_qd 的回复:
运行效率一样。
敲代码的效率比if else高(因为需要敲的字符少)。
别人读懂你的程序的效率比if else低。

恩,当然我自己还是用if来写的,也方便自己读。但是在其他地方看到过汇编出来的代码条数用if判断的要多一些。


刚才试了下,不觉得多呀,还能再简化吗(感觉不可能)

unsig……
[/Quote]
你这个是没用if判断的汇编吧,那用if判断的汇编呢?
iamshuke 2010-08-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kingbyang1 的回复:]
引用 2 楼 xxd_qd 的回复:
运行效率一样。
敲代码的效率比if else高(因为需要敲的字符少)。
别人读懂你的程序的效率比if else低。

恩,当然我自己还是用if来写的,也方便自己读。但是在其他地方看到过汇编出来的代码条数用if判断的要多一些。
[/Quote]

刚才试了下,不觉得多呀,还能再简化吗(感觉不可能)

unsigned int n1 = GetTickCount();
unsigned int n2 = GetTickCount();
unsigned int result;
result = (n1 > n2)? n1 : n2;
...

汇编
mov edi, dword ptr[00406000]
call edi ;调用GetTickCount()
mov esi, eax ;esi为n1
call edi ;调用GetTickCount(), eax为n2

;从这里开始
cmp esi, eax //比较n1,n2
mov ecx, esi //result = n1
ja 00401016 //n1 > n2时跳转
mov ecx, eax //没跳转,result = n2

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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