问题6

int a = -5;
int b = 0;
………….
if(a > 0)
{
	b = 1;
}
else
{
	b = 2;
}

int a = -5;
int b = 0;
………….
if(a <= 0)
{
	b = 2;
}
else
{
	b = 1;
}

#include<cstdio>
#include<windows.h>
int main()
{
    int a = -5;
    int b;


    DWORD t1 = ::GetTickCount();
    for(int i=0;i<500000000;i++)
    {
       if(a<0)
       {
        b = 0;
       }
       else
       {
        b = -1;
       }
    }
    DWORD t2 = ::GetTickCount();
    printf("%d\n%d\n",t1,t2);
    printf("用时:%dms\n\n",t2-t1);


   DWORD t3 = ::GetTickCount();
    for(int i=0;i<500000000;i++)
    {
       if(a>=0)
       {
        b = -1;
       }
       else
       {
        b = 0;
       }
    }
    DWORD t4 = ::GetTickCount();
    printf("%d\n%d\n",t3,t4);
    printf("用时:%dms\n\n",t4-t3);
}


理论上根据流水线原则第一个时间将会小些,但是codeblocks运行的结果无论如何都是这个结果 第一个数据大于第二个数据

在vs2008上面也是的。

好奇怪的样子。

同样是局部性原理:当CPU执行某条机器指令时(同样存储在内存中),很大的概率会执行该条指令下面的几条指令
流水线技术会提前为这几条将要执行的指令,做好准备工作。(执行这几条指令的几个阶段:如从内存中取指令、译码、准备操作数等等)
当遇到条件跳转指令时,有可能提前做的准备是无用功——跳转发生了,很影响效率
静态分支预测:若跳转是向下的,则预测为不跳转(多为if类语句);若跳转是向上的,则预测为跳转(多为循环语句)
通常,大概率发生的分支,放在if分支中,不要放在else分支中

你可能感兴趣的:(C++,c,C语言)