if(!n) ,if(n),和if(x==n) 哪个速度更快 为什么

if(!n) ,if(n),和if(x==n)哪个速度更快 为什么 具体有多大差距 如果有
for(i=0;i<70000;i++)
{
if(...)
}
三种情况差距大吗 具体能差多少个count
分支指令预测技术
1.分支指令预测
在程序中一般都包含有分支转移指令,据统计,平均每七条指令中就有一条是分支转移指令.在指令流水线结构中,对于分支转移指令相当敏感。假设在80486的指令流水线中的第一条指令已进入到译码阶段,而第二条指令已进入到提取阶段(准备进入译码器),如果发现第一条指令是分支指令(如跳转到某个地址),则指令预取队列中下一条及下下条等指令预取无效。这时(确切地说,等到第一条指令执行期间形成了分支的目标地址),需从目标地址中现取指令,并交付执行,同时应立即清除指令预取队列,再将目标地址后面的指令预取过来填到队列中。这表明,一遇到分支指令,整个指令流水线就被打乱一次,稍后才能恢复到正常。显然,这影响了机器的运行速度。为此,在Pentium处理器中使用了分支目标缓冲器(Branch Target Buffer,BTB)来预测分支指令。
这是我找到的 答案 3楼明显就是个白痴 对于PC 的CPU来说是看不出什么区别 但是换在其他平台比如很低端的芯片 就有区别了

楼上说的对,编译器会给你优化。
如果编译器傻到不优化,或者说你这么较真:肯定是运算操作多的count多,不过多也多不了几个count。一般的CPU执行的话都是感受不到这个优化的。
虽然和这个问题没有关系,但还是要说一句:要想给程序做优化,还是注重在算法上的优化吧!

看了你的补充我也补充一下,你补充的说法没有错,但是请注意:

1、上面的三个都是if指令,在CPU执行中肯定要判别是否要跳转(俗称判跳),而是否要执行跳转是根据你判跳条件是否满足来决定的,在满足的前提下才会跳转而打乱指令流水线。那么可以说,一个程序中3次满足跳转肯定比5次满足跳转用的时间少。

2、再看你的三条指令,都是if指令,唯一的区别在于判断的条件不同,那么他们之间执行时间的差异原因并不在于是否打乱流水线(因为他们执行都要打乱流水线)而在于 n,!n,x==n三条指令的执行时间的差异。而这跳指令都是逻辑判断指令,不需要打乱流水线来实现的。差异可能就是一两个Count不会影响大局,就算是51执行可能也是几个us的差异。

3、接着看你下面的循环,如果if循环内的程序是一样的。那么这个大循环的时间差别就是分别执行70000次n,!n,x==n时间上的差距。再低端的芯片差距也不明显。

4、具体有多大差距,因为不知道你在什么硬件上跑所以不能回答你具体差距。因为CPU不同,晶振频率不同,执行一条机器指令的时间也不同。另外,如果你熟悉汇编语句的话,你可以发现CPU厂家不同,硬件就会不同,能够支持的汇编指令集也不同。那么n,!n,x==n三条指令写成汇编或者机器码的话写法就不同,执行也不同。
但是测试的方法是有的,你在你的平台上分别执行下面三个语句:
for(i=0;i<70000;i++)
{
a=n;
}

for(i=0;i<70000;i++)
{
a=!n;
}

for(i=0;i<70000;i++)
{
a=(x==n);
}
再用计时器看看他们执行的时间,估计用秒表计时的话70000次应该不够,可能要再嵌套N个大循环才行,

5、最后,如果你是用C语言来写程序,最终都会被编译器转化汇编代码,再被解释器成机器码。所以编译器会对你这样的语句针对目标CPU的特性进行优化。优化之后,差距就更小了。那上面的测试就不能做了,因为你不管你写成什么样都可能被优化成一样的执行了。那么只能用你的CPU平台支持的汇编指令集来写汇编代码测试看看了。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-01-07
具体看编译器了
编译器会给你优化成同一种的哦
第2个回答  2009-01-08
你在上述3个方法的语句头尾分别插入gettickcount(), 然后相减一下算出CPU多长时间去做功,当然只能精确到 ms。 另一个方法是:你可以调度x86的汇编编译结果来看看有多少的指令码,然后查每个指令码的执行时钟周期,不就知道3个方法的相差倍数了吗。但是如果你想知道具体几秒执行完就复杂了,就要提供更多系统配置资料去推算。
第3个回答  2009-01-07
这种问题很蠢

if(!n) ,if(n),和if(x==n) 哪个速度更快 为什么
n,x==n三条指令的执行时间的差异。而这跳指令都是逻辑判断指令,不需要打乱流水线来实现的。差异可能就是一两个Count不会影响大局,就算是51执行可能也是几个us的差异。3、接着看你下面的循环,如果if循环内的程序是一样的。那么这个大循环的时间差别就是分别执行70000次n,!n,x==n时间上的差距。

计算机中if(!n)是什么意思?
if是个条件判断,如果括号中的结果为真,则执行if包含的语句,如果为假则不执行。!是非的意思,就是如果n为真 则!n就是假了,n要为假 则!n就是真了 在C语言中 整数中的0表示假,非0表示真 字符中 '\\0'表示假,其他字符表示真。所以,根据n的不同情况去判断括号中的值为真或假就可以了 ...

c语言中if(i=n)和if(i==n)有什么区别?
差别大了!i=n是赋值,i==n是判断是否相等。严格来讲是不允许if(i=n)这种写法的,因为理解困难,后患无穷

单片机程序中 if(!N) 这语句什么意思?
首先if()的括号中的值等于1(或者为真)才会执行下面{}大括号中的语句,怎么样是等于1(为真)。就是比如前面定义了N=1;而后面的if(N==1),则括号内N本来就是等于1的,所以括号中的值为真,执行下下面的语句.而!N的"!"叹号则是表示取反的意思,如果上面定义了N=1;而后面的(!N)则是N取...

C语言中if(!n)是什么意思?
对于整数 ,当n为0时,转换为布尔值就是 假,此时 !n 就是 真 进入if后面的语句块 当 n 为 非0值是,转换为布尔值 就是 真,此时 !n 就是假,不执行if后面的语句块 如果n 本身就是布尔值,也就是 在n为假的时候 执行if后面的语句块,n为真的时候不执行 if后面的语句块 希望可以帮助到你 ...

C语言中,if(!(n%i))和if !(n%i)的区别
C语言中,判断需要括号括起来 后面的写法不正确 ~~~

if (n==0) return 0; else if (n==1) return 1;什么意思
如果 n 等于0 ,函数执行完毕,返回0 如果n 等于1, 函数执行完毕,返回 1 其他情况下,继续执行函数体里下一行语句

if(i==N)是什么意思
如果,i=n 如果你对这个答案有什么疑问,请追问,另外如果你觉得我的回答对你有所帮助,请千万别忘记采纳哟!

今天碰到一个面试题,求解!请问if(n==10)和if(10==n)区别?哪个更好?
这个看习惯的..其实效率是一样的..无所谓 但是如果你能更改习惯..我建议使用 10==n 这个关系到错误检查的问题...因为很多时候..你写代码是根据自己组织的语言思路来的 所以你经常会写 if (n=10) 如果某语言是弱语言或者编译器检查不严格..其实中间的条件就100%是true~~ 但是如果你反过来10=n...

C语言if(!r->num)和if(!n)怎么样理解
而(!(r->num))更相当于关系运算表达式(!(r->num))==1如果还不好理解,你把(!(r->num))看成是一个整体,这个整体就是表达式 对于if语句,它是这样的 if(表达式) 语句1 else 语句2 它的意思是判断该表达式的值是否为真.也就是说,判断该表达式的值是否为1.如果为1,则执行语句1,如果为...

相似回答