您的位置:首页 > 编程语言

c代码性能优化

2015-11-15 02:00 155 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/ywkuang_09/article/details/49843969

经验:

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;
}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: