代码优化---循环展开

今天在看阿里技术公众号的文章-》含代码 | 支付宝如何优化移动端深度学习引擎?发现了一个有意思名称-》循环展开,就搜索了下。

放一下搜索后的内容和自己的想法。

原文地址  代码细节的终极优化之循环展开、多路并行

void combine5(double data[],int length)
{
      double sum = 0.0;
      for(int i=0;i<length;i++)
      {
        sum *= data[i];
      }
      cout<<sum<<endl;
}


void combine6(double data[],int length)
{
      double sum = 0.0;
      int limit = length-1;
      int i;
      for(i=0;i<limit;i+=2)
      {
           sum = sum*data[i]*data[i+1];
      }
      for(;i<length;i++)
      {
          sum *= data[i];
      }
      cout<<sum<<endl;
}


void combine7(double data[],int length)
{
      double sum1=0.0,sum2=0.0;
      int limit = length-1;
      int i;
      for(i=0;i<limit;i+=2)
      {
            sum1 *= data[i]; // 合并下标为偶数的值, 0按偶数算
            sum2 *= data[i+1]; // 合并下标为奇数的值
      }
      double sum = sum1*sum2;
      for(;i<length;i++)
      {
           sum *= data[i];
      }
      cout<<sum<<endl;

}

原文作者的观点:

combine5 做了简单的优化,combine6做了循环展开,combine7既循环展开又多路并行。若combine5运行时间为5,combine6运行时间就是2.5!combine7的运行时间就会使1!IA32后的指令集都会支持如此优化,但绝大多数编译器不会帮你把代码改写成这个样子,所以自己写是最好的。如果加上SSE,会把CPU的能力榨干。

自己的看法:

把代码流程梳理下 ,就是C5 单步 单业务操作,C6 单步多业务操作,C7 多步多业务操作。 在硬件条件不好或者业务计算量大的时候,就可以明显的发现差异和区别。

我自己早两天也有相同类似的情况。不过在数据库相似的例子 ->(若有10000条数据需要实现插入操作)

简单就是for insert 10000下。  类似  C5。

如果将 多个 insert 插入合并成一个insert , 类似 C6

如果将  多个insert  分两个insert。然后并行两个程序 同步插入。类似C7.

有些东西与代码无关,在乎于思路、计算机底层或者原理性的东西。好的理念和思路具备广泛的通用性。

猜你喜欢

转载自blog.csdn.net/hu19930613/article/details/80810792