zoukankan      html  css  js  c++  java
  • 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) << "	";
        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;
    }
  • 相关阅读:
    期待Eclipse3.4
    Winforms中使用系统托盘图标
    Eclipse下的Struts2开发插件
    彩色 夺冠
    网络&系统
    A Famous Music Composer
    Quick Brown Fox
    解密QQ号——队列
    谁先倒
    bootstrap Table从零开始
  • 原文地址:https://www.cnblogs.com/misspy/p/3843025.html
Copyright © 2011-2022 走看看