经验:
1:宏定义展开
2:for循环展开
1:宏定义展开
例如: #define LEN (64*1024*1024)
修改为 #define LEN 0x4000000
原因是避免了替换后的乘法计算
展开前的时间消耗是 624ms
展开后为515ms
时间减少了17%。
2:for循环展开
例如:对数组arr[LEN]中每个元素乘以三。
可能是
for(i=0;i<LEN;i++)
{
arr[i]*=3;
}展开后
for(i=0,j=1;j<LEN;i++,j++)
{
arr[i]*=3;
arr[j]*=3;
}
if(i==LEN)
{
arr[i]*=3;
}
测试的性能是
前者使用了515ms
后者使用了374ms
消耗时间减少了27%。
参考了 <七个例子帮你更好地理解 CPU 缓存> :点击打开链接
里面第1,2例子测试的结果不一样,可能和使用平台有关,但这里的性能差距还是体现了 “指令级并行”例子。
最后优化后的代码是
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define LEN 0x4000000
//(64*1024*1024)
void test1(int step,int size)
{
int *arr=malloc(sizeof(int)*size);
int i,p,j;
DWORD s,e,d;
DWORD s1,e1,d1;
s=GetTickCount();
for(i=0,j=1;j<LEN;i+=2,j+=2)
{
arr[i]*=3;
arr[j]*=3;
}
if(i<LEN)
arr[i]*=3;
e=GetTickCount();
d=e-s;
printf("%ld\n",d);
free(arr);
}
int main()
{
int i;
//for(i=1;i<=256;i++)
test1(i,LEN);
return 0;
}

被折叠的 条评论
为什么被折叠?



