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

来源:百度知道 编辑:UC知道 时间:2024/06/17 02:23:06
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);
}
再用计时器看看他们执行的时间,