c代码性能优化

经验:

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值