C/C++代码性能优化总结


1.展开循环

通过增加每次迭代时计算的数量,来减少循环的次数,从而提升程序的性能。

以1到n个整数相加为例子

//一般代码
for (i = 1; i < n+1; i++)
{
    iRes = iRes OPER i;
}

//循环展开后的代码
for (i = 1; i < n; i+=3)
{
    iRes1 = iRes1 OPER i OPER (i+1) OPER(i+2);
}

for (; i < n+1; i++)
{
    iRes1 = iRes1 OPER i;
}

测试结果

可以看到循环展开后的程序性很差不多提升了一倍。

2.循环分割

通过将一组运算分隔成2个或者更多的部分,最后合并结果来提升性能。

依然是以以1到n个整数相加为例子

//一般代码
for (i = 1; i < n+1; i++)
{
   iRes = iRes OPER i;
}

//循环分隔后的代码
for (i = 1; i < n; i+=2)
{
    iRes1 = iRes1 OPER i;
	iRes2 = iRes2 OPER (i+1);
}

for (; i < n+1; i++)
{
    iRes1 = iRes1 OPER i;
}

return iRes1 OPER iRes2;

测试结果:

3.减少不必要的内存应用

再次以1到n个整数相加为例子

//一般代码
void oper1(int *iRes)
{
    int i;
	
    for (i = 1; i < 101; i++)
    {
        *iRes = *iRes OPER i;
    }
}

//不使用内存应用的代码
void oper2(int *iRes)
{
    int i;
	int ibuf(0);
	
    for (i = 1; i < 101; i++)
    {
        ibuf = ibuf OPER i;
    }

	*iRes = ibuf;
}

测试结果

总结3的完整测试代码

#include <time.h>
#include <iostream>
#define OPER +
#define INIT 0

using namespace std;

void oper1(int *iRes)
{
    int i;
	*iRes = 0;
	
    for (i = 1; i < 101; i++)
    {
        *iRes = *iRes OPER i;
    }
}

void oper2(int *iRes)
{
    int i;
	*iRes = 0;
	int ibuf(0);
	
    for (i = 1; i < 101; i++)
    {
        ibuf = ibuf OPER i;
    }

	*iRes = ibuf;
}

typedef void (*FUNC)(int *n);

int test(FUNC calc_oper, int n)
{
	int iResult(0);
	calc_oper(&iResult);
    cout << " iResult: " << iResult << "\t";
    time_t t_begin;
    time(&t_begin);
	
    for (int i = 0; i < 10000; i++)
        for (int j = 0; j < 10000; j++)
            calc_oper(&iResult);
		
	time_t t_end;
	time(&t_end);
	cout << "Spend Time: " << difftime(t_end, t_begin) << endl;

	return 0;
}

int main()
{
	int n=100;
    cout << "oper1 ";
    test(oper1, n);
	
    cout << "oper2 ";
    test(oper2, n);
    return 0;
}

 

具体原理参考深入理解计算机系统一书第五章

暂无评论

注册用户登录后才能发表或者回复评论,请先登录 注册。