• 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;
    }
  • 相关阅读:
    JS 基于面向对象的 轮播图1
    JS 原型继承的几种方法
    angularJs 自定义服务 provide 与 factory 的区别
    C# 调用JS Eval,高效率
    Linq表连接大全(INNER JOIN、LEFT OUTER JOIN、RIGHT OUTER JOIN、FULL OUTER JOIN、CROSS JOIN)
    C# LINQ干掉for循环
    C# 彻底搞懂async/await
    .NET中的异步编程——动机和单元测试
    .NET中的异步编程——常见的错误和最佳实践
    C# 实用代码段
  • 原文地址:https://www.cnblogs.com/misspy/p/3843025.html
Copyright © 2020-2023  润新知