C++ 代码性能优化 -- 循环分割提高并行性

对于一个可结合和可交换的合并操作来说,比如整数的加法或乘法,

我们可以通过将一组合并操作分割成 2 个或更多的部分,并在最后合并结果来提高性能。

 

原理:

普通代码只能利用 CPU 的一个寄存器,分割后可以利用多个寄存器。

当分割达到一个数量时,寄存器用完,性能不再提升,甚至会开始下降。

 

用代码来描述,如下:

// 一般情况下的代码    
for (i = 1; i < n+1; i++)
{
    res = res OPER i;
}

// 循环分割后代码
for (i = 1; i < n; i+=2)
{
    res1 = res1 OPER i;
    res2 = res2 OPER (i+1);
}

int 整数加法,性能测试结果对比如下:

整数的加法,普通代码运行 26s,循环分割后,18s。

浮点数计算的性能提升,明显大于整数,乘法的性能提升,略大于加法。

 

完整测试代码:

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

using namespace std;

int calc1(int n)
{
    int i;
    int res = INIT;

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

    return res;
}


int calc2(int n)
{
    int i;
    int res1 = INIT;
    int res2 = INIT;

    for (i = 1; i < n; i+=2)
    {
        res1 = res1 OPER i;
        res2 = res2 OPER (i+1);
    }
    for (; i < n+1; i++)
    {
        res1 = res1 OPER i;
    }

    return res1 OPER res2;
}

typedef int (*FUNC)(int n);

int time_test(FUNC calc, int param)
{
    cout << " Result: " << calc(param) << "\t";
    time_t t_begin;
    time(&t_begin);

    for (int i = 0; i < 10000; i++)
        for (int j = 0; j < 10000; j++)
            calc(param);

    time_t t_end;
    time(&t_end);
    cout << "Time Cost: " << difftime(t_end, t_begin) << endl;
}

int main()
{
    cout << "calc1 ";
    time_test(calc1, 100);

    cout << "calc2 ";
    time_test(calc2, 100);
    return 0;
}

 

posted @ 2014-07-14 16:45  Jackon Yang  阅读(5364)  评论(0编辑  收藏  举报