这两句代码有什么区别
请问, if(a == 0) 和 if (!a) 在效率上有什么区别?如果执行非常多次,比如500万次。时间上会有差别吗?
本帖最后由 santaclaus 于 2014-7-9 10:12 编辑
int a= 1;
if (a == 0)
{
a = 1;
}
if (!a)
{
a = 1;
}
//反汇编
int a= 1;
00BB705Emov dword ptr ,1
if (a == 0)
00BB7065cmp dword ptr ,0
00BB7069jne main+32h (0BB7072h)
{
a = 1;
00BB706Bmov dword ptr ,1
}
if (!a)
00BB7072cmp dword ptr ,0
00BB7076jne main+3Fh (0BB707Fh)
{
a = 1;
00BB7078mov dword ptr ,1
}
从反汇编代码来看,完全一样。。。 7: if(a == 0)
0040102F cmp dword ptr ,0
00401033 jne main+32h (00401042)
12: if(!a)
00401042 cmp dword ptr ,0
00401046 jne main+45h (00401055)
反汇编一下就可以知道了啊完全一样
这个技巧还是得知道下很实用的 一定要自己会调试哦 判断语句本身没有差别,差别在于你的数据结构 第二种方法更给力~ 本帖最后由 zhoushilei 于 2014-7-9 17:04 编辑
这两句代码的效率几乎是一样的,对于赋值的这些内部操作的代码,我们都认识是O(1)时间的,经常在大O复杂度中被省略。只有对于一些大量循环或者是大量的输入输出的时候,才会计算到O(N),O(N方)这样的。无论的现实中还有在ACM中,这个代码的时间探讨其实都毫无意义。是O(1)时间的。
例如如
#include <iostream>
using namespace std;
void main()
{
int a=1,n=50000000;
for(int i=0;i<n;i++)
{
if(a==0)
cout<<"执行!"<<endl;
}
}
这个的复杂度是O( n)
#include <iostream>
using namespace std;
void main()
{
int a=1,n=50000000;
for(int i=0;i<n;i++)
{
if(!a)
cout<<"执行!"<<endl;
}
}
这个的复杂度也认为是O( n)
所以说基本上我们是忽略这两个的区别,而仅仅关注于代码执行数。所以虽然可能有差别,但是几乎在分析中是忽略的。如果真的要看时间的差别,可以看的汇编;还可以用ctime的函数来测试一下时间,具体请自行百度。
本帖最后由 折心灬小轩 于 2014-7-9 21:20 编辑
这两句在效率上的比较不能靠反汇编来简单地解决,首先,不同编译器对相同语句的不同解释是一个问题,其次,楼上说用ctime测试一下,个人认为每次调用函数执行中断时的机器状态不同也会引起误差,所以这个问题不能这样简单的用一些常见方式来解决。
我的建议:
1.如果想通过反汇编来解决此问题,你必须排除一切无关条件,比如说,在使用相同编译器系统下保证他的优化结果是相同的
2.由于机器状态不可控,所以任何以外部中断为思想的方法都不能解决此问题
3.从技术角度分析,上述语句肯定有差别,但是在现代编译器系统的优化下,结果应该是一样的,所以你无论怎么样写都是可以的,如果非要一个原始码的效率比较,见下:
if(a == 0):从编译器动作看,首先需要取量a的地址,之后用a的地址进行一次定址寻址,将其操作数移动至指定的运算器,之后再cmp,之后就,,,效率可见一斑。
if (!a)同样的,取址,定址寻址和上面的动作是完全一样的
他们两个唯一的区别就是:编译器系统工作的时间, if(a == 0)比较正规,但由于其操作符与操作数较多,编译器在编译时要耗费更多的时间,相比之下 if (!a)就简洁多了,不过容易出错。。。
总结:在同等优化技术的条件下,前者编译时间比后者长,但差距几乎可以不计,两者运行时效率相同;在不同等优化技术的条件下,无法比较
满意请采纳,不满意请追问 没区别,if(a)中只要不为零就能执行 不要当语言专家~ {:2_27:} 有一点小小的区别,.一直纠结意义不大,在有些运算程序上的话还是有一点点小区别.不过在大多程序用意思都一样..如果下次遇到这样的问题用用就自然懂了.慢慢摸吧! 楼主可以从“《高质量C和C++编程指南》一书,第四章 4.3节,if语句 ”,专门分析if语句与零值比较,我们编码出发点的是其中之一,1,人容易理解,2机器执行高效。但两者是对立的,时间和空间 分析的很好 莫有区别吧 都一样,不过第二个感觉更好 大家都是高手,菜鸟路过 厉害 厉害 学些学习了
页:
[1]