这是一个提高2倍速的例子func1(size_t n) { int a; size_t i; for(i = 0; i < n; i++) { a = 0; } } func2(size_t n) { int a; int d = n%8; int i = n/8; switch(d) { do{ case 7: a = 0; case 6: a = 0; case 5: a = 0; case 4: a = 0; case 3: a = 0; case 2: a = 0; case 1: a = 0; case 0: a = 0; default: ; }while(--i != 0); } } int main() { int i,j,k; size_t n = 1000000000; i = GetTickCount(); func1(n); j = GetTickCount(); func2(n); k = GetTickCount(); printf("%d,%d\n",j-i,k-j); } 漫长的等待后打印出 21711,7842 差不多2.8倍。 如果加大case分支数,可以得到更好的效果
{
float fx = ix * 3.14.59;
sum += fx; //这里可能会出现先写后读相关,并行程度不会很高,就算能机器可以自动
//优化也是利用内存读推迟或者是通过相关专用单元来解决。而且循环会增加预判的不确定性。
}sum += 3,14159 + 2 * 3.14159 + 3 * 3.14159 + 4 * 3.14159 + 5 * 3.14159;
如果浮点加是+6的时间作完,那么该表达式的计算的时间是, +6--》流水线建立时间,
以后每过+1出来一个浮加结果,6 + 5 = 11,忽略取指和操作数送运算单元的时间。
想不出好的例子,以前看过的书上有一些好的例子。
向下面文章里面的优化 在VC里该怎么实现?
还有,Intel的编译器是不是收费的?
http://www.csdn.net/develop/Read_Article.asp?Id=18378
{
int a;
size_t i;
for(i = 0; i < n; i++)
{
a = 0;
}
}
func2(size_t n)
{
int a;
int d = n%8;
int i = n/8;
switch(d)
{ do{
case 7: a = 0;
case 6: a = 0;
case 5: a = 0;
case 4: a = 0;
case 3: a = 0;
case 2: a = 0;
case 1: a = 0;
case 0: a = 0;
default: ;
}while(--i != 0);
}
}
int main()
{
int i,j,k;
size_t n = 1000000000;
i = GetTickCount();
func1(n);
j = GetTickCount();
func2(n);
k = GetTickCount(); printf("%d,%d\n",j-i,k-j);
}
漫长的等待后打印出
21711,7842
差不多2.8倍。
如果加大case分支数,可以得到更好的效果