精华内容
下载资源
问答
  • 循环优化

    2020-11-13 21:39:00
    循环优化Performace Optimization – Loops pipline 流水线 unrolling 循环展开 merge 循环合并 merge 循环合并 dataflow 不能用dataflow 改进后可以用 不能用dataflow 改善后可以 循环嵌套 不同地方做...
    循环优化Performace Optimization – Loops
     pipline 流水线
    unrolling  循环展开
    merge  循环合并

    merge  循环合并

     

     dataflow

     

    不能用dataflow

     

     改进后可以用

     不能用dataflow

     改善后可以

    循环嵌套

     

     

     不同地方做流水的影响

     最外层流水,延迟最低,消耗最多因为展开这个循环以内所有的循环体

     

     建议最内层做流水,要不然消耗资源太多

    其他优化方法

     并行执行加流水

     

     

     如果循环边界不确定出现?

    展开全文
  • 易语言循环优化源码

    2020-07-22 22:16:35
    易语言循环优化源码,循环优化,线程,GetInputState
  • 主要介绍了通过循环优化 JavaScript 程序,对于提高 JavaScript 程序的性能这个问题,最简单同时也是很容易被忽视的方法就是学习如何正确编写高性能循环语句。下面我们来学习一下吧
  • 多重For循环 优化

    2012-11-06 23:34:34
    多重For循环 优化
  • 循环的优化分为源码上的修改和编译器的优化,编译器能自动执行许多循环优化技术,但对源代码的修改可辅助编译器就行优化处理。 1. 源码上的优化 1. 多重循环的“外小内大”   在多重循环中,采用迭代次数较小的...

    前言

      循环是程序中最常见结构,针对循环已有众多的优化技术。循环的优化分为源码上的修改和编译器的优化,编译器能自动执行许多循环优化技术,但对源代码的修改可辅助编译器就行优化处理。

    1. 源码上的优化

    1. 多重循环的“外小内大”

      在多重循环中,采用迭代次数较小的循环驱动内层迭代次数较大的循环能减少内存的消耗,如下示例:

    for (int i = 0; i < 10000; i++) {
        for (int j = 0; j < 200; j++) {
    
        }
    }
    改为:
    for (int i = 0; i <200 ; i++) {
        for (int j = 0; j < 10000; j++) {
    
        }
    }
    
    2. 循环变量实例化放在循环外

    如下示例:

    int i,j;
    for (i = 0; i <200 ; i++) {
        for (j = 0; j < 10000; j++) {
    
        }
    }
    
    3. 循环无关的表达式放到循环外

    如下示例:

    int i,j;
    for (i = 0; i <200 ; i++) {
        for (j = 0; j < 10000; j++) {
              j = i*j*x/(y-1);
        }
    }
    改为:
    int i,j,tmp;
    tmp = x/(y-1);
    for (i = 0; i <200 ; i++) {
        for (j = 0; j < 10000; j++) {
              j = i*j*tmp;
        }
    }
    
    4. 消除循环终止时的方法调用

    如下示例:

    for (int i = 0; i < vec.size(); i++) {
    
    }
    改为:
    int size = vec.size();
    for (int i = 0; i < size; i++) {
    
    }
    
    5. 循环外部捕获异常

      在循环外部捕获异常能有效减少内层消耗。一般而言,foreach 循环优先于传统的 for 循环。

    6. 循环的 i++ 改为 ++i

      效率上来说++i 比 i++来的更有效率(后置操作符必须先保存操作数原来的值),但现代编译器上这个影响会很小。


    2. 编译器角度的优化

    1. 循环展开(loop Unrolling)

      重组循环,以便每次迭代多次使用加载的值,让一拍流水线上尽可能满。在流水线中,会因为指令顺序安排不合理而导致CPU等待空转,影响流水线效率。循环展开为编译器进行指令调度带来了更大的空间。
    如下示例:

    do j = 1,2*n
        do i = 1,m
            A(j) = A(j) + B(i)
        enddo
    enddo
    
    Unrolling之后:
    do j = 1,2*n by 2
        do i = 1,m
            A(j) = A(j) + B(i)
            A(j+1) = A(j+1) + B(i)
        enddo
    enddo
    
    2. 循环分块(loop tiling)

      由于内存空间有限,代码访问的数据量过大时,无法一次性将所需要的数据加载到设备内存,循环分块能有效提高处理器 cache 上的访存效率,改善数据局部性。(分块应用于外部循环,它会增加计算的空间和时间局部性;分块应与缓存块一起使用,因为这样可以提高最内部软件流水线的效率)。示意如图:
    loop1

    如下示例:

    do j = 1,2*n
        do i = 1,m
            A(j)= A(j) + B(i)
        enddo
    enddo
    
    Tiling之后:
    do jj = 1,2*n by 2
        do i = 1,m
            do j = jj, jj+2-1
                A(j)= A(j)+B(i)
            enddo
        enddo
    enddo
    
    Unroll and Jam之后:
    do jj = 1,2*n by 2
        do i = 1,m
            A(j)= A(j)+B(i)
            A(j+1)= A(j+1)+B(i)
        enddo
    enddo
    

    更多关于 loop tiling 的优化方法可参见论文:《Augmenting Loop Tiling with data Alignment for Improved Cache Performance》《Automatic Tiling of Iterative Stencil Loops》《面向局部性和并行优化的循环分块技术》

    3. 循环交换(loop interchange)

      内外层循环交换,改善空间局部性,并最大限度地利用引入缓存的数据。对循环进行重新排序,以最大程度地减少跨步并将访问模式与内存中的数据存储模式对齐。
    如下示例:

    do i=1,n
        do j=1,n
            A(i,j)=B(i,j)*C(i,j)
        enddo
    enddo
    
    interchange之后:
    do j=1,n
        do i=1,n
            A(i,j)=B(i,j)*C(i,j)
        enddo
    enddo
    
    4. 循环融合(loop fusion)

      将相邻或紧密间隔的循环融合在一起,减少的循环开销和增加的计算密度可改善软件流水线,数据结构的缓存局部性增加,编译器在某些情况下未执行融合,需要手动完成。
    如下示例:

    for(i = 0; i < size; ++i){
        A(i) = a(i) + b(i);
        c(i) = 2*a(i);
    }
    for(i = 1; i < size-1; ++i){
        D(i) = c(i) + a(i);
    }
    
    fusion之后:
    A(0) = a(0) + b(0);
    c(0) = 2*a(0);
    A(size-1) = a(size-1) + b(size-1);
    c(size-1) = 2*a(size-1);
    for(i = 1; i < size-1; ++i){
        A(i) = a(i) + b(i);
        c(i) = 2*a(i);
        D(i) = c(i) + a(i);
    }
    
    5. 循环分裂(loop fission)

      将循环分成多个循环,可以在有条件的循环中使用,分为无条件循环和含条件循环。
    如下示例:

    for(i = 0; i < size; ++i){
        A(i) = a(i) + b(i);
        c(i) = 2*a(i);
        if(temp[i] > data)
            d(i) = a(i);
    }
    
    fission之后:
    for(i = 0; i < size; ++i){
        A(i) = a(i) + b(i);
        c(i) = 2*a(i);
    }
    for(i = 0; i < size; ++i){
        if(temp[i] > data)
            d(i) = a(i);
    }
    
    6. 循环剥离(loop peeling)

      剥离 k 次迭代意味着从循环主体中删除这些迭代并将其放置在循环主体之前或之后。
    如下示例:

    do i=1,n
        Y(i,n) = (1.0 - x(i,1))*y(1,n) + x(i,1)*y(n,n)
    enddo
    
    peeling之后:
    t2 = y(n,n)
    x(i,1) * y(n,n)
    y(1,n) = (1.0 - x(1,1))*y(1,n) + x(1,1)*t2
    t1 = y(1,n)
    do i=2,n-1
        Y(i,n) = (1.0 - x(i,1))*t1 + x(i,1)*t2
    enddo
    y(n,n) = (1.0 - x(n,1))*t1 + x(n,1)*t2
    
    7. 循环强度减弱(Strength reduction in loops)

      使用简单的表达式来替换复杂的表达式。
    例如,除法替换,如下示例:

    z(i) = x(i)/y(i)
    w(i) = u(i)/v(i)
    
    Strength reduction之后:
    tmp = 1.0/(y(i)*v(i))
    z(i) = x(i)*v(i)*tmp
    w(i) = u(i)*y(i)*tmp
    

    References:

    • https://blog.csdn.net/qq_37436998/article/details/100055770
    • https://www.cs.colostate.edu/~mstrout/CS553Fall07/Slides/lecture27-tiling.pdf
    • http://users.cecs.anu.edu.au/~Alistair.Rendell/sc02/module2b.pdf
    展开全文
  • for循环优化

    2018-07-26 17:27:45
    for循环优化 for (var i = 0; i &lt; list.length; i++) { //…… } ==》 let i = list.length; while (i--) { } 代码优化

    for循环优化

    for (var i = 0; i < list.length; i++) {
                //……
            }

    ==》

    let i = list.length;
     while (i--) {
    
     }

    代码优化

    展开全文
  • 介绍了Javascript中的循环优化,有需要的朋友可以参考一下
  • 双重for循环优化

    2020-12-28 10:18:30
    双重for循环优化 双重for循环优化思想:主要是将某一层的数据转成map类型,用比较字段去map里面get,若拿到数据则匹配上了 由于是在云上开发,代码拿不下来(公司限制了),就只能截图了,希望读者将就着看。 ...

    双重for循环优化

    双重for循环优化思想:主要是将某一层的数据转成map类型,用比较字段去map里面get,若拿到数据则匹配上了

    由于是在云上开发,代码拿不下来(公司限制了),就只能截图了,希望读者将就着看。

     

    展开全文
  • 循环优化与多面体模型

    千次阅读 2019-09-22 21:22:08
    循环通常是数据并行应用的最密集计算段,因此循环优化直接影响性能。当面对嵌套循环时,分配给线程的计算粒度将直接影响性能。循环转换如Fission(循环裂变)与Fusion(循环融合)的嵌套式循环可促使并行化,并提高...
  • c语言循环优化

    千次阅读 2014-01-13 11:53:27
    循环优化 提高程序效率的核心是对影响代码执行速度的关键程序段进行优化。在任何程序中,最影响代码速度的 往往是循环语句,特别是多层嵌套的循环语句。因此,掌握循环优化的各种实用技术是提高程序效率的 ...
  • 代码优化技巧2:循环优化 本文算不上什么很有独创性的东西,在很多人的文章和书籍中都有看到,比如深入理解操作系统在的5/4,韩天峰老师的谋篇&lt;php需要聪明人的语言&gt;也提到过一些相关内容. 在大多数的...
  • 也正是由于这部分代码序列可能会被反复执行,所以在进行中间代码优化时应着重考虑循环优化,这对提高目标代码的效率起到很大的作用。为了进行循环优化,首先需要确定的是程序流图中哪些基本块构成一个循环。按照结构...
  • 双重大数组循环优化

    千次阅读 2018-03-04 19:19:19
    双重大数组循环优化 一、前言 这几天发现服务在凌晨时容易报警,持续半个小时才正常,第二天分析日志和检查代码发现,有一个过滤黑白名单的操作,其中黑名单的数据有39万,白名单数据30万,然后处理的数据也有80...
  • 多层for 循环优化方法

    2020-04-21 15:16:11
    多层for 循环优化方法 demo public List<AclModuleLevelDto> roleTree(int roleId) { // 1、当前用户已分配的权限点 List<SysAcl> userAclList = sysCoreService.getCurrentUserAclList(); // 2、...
  • TRANS是基于CTL的优化变换描述语言,对TRANS语言作了宏扩展,给出了循环嵌套、循环归纳变量、循环依赖及方向...从依赖分析的角度对重排序循环优化变换加以考查,并以循环逆转和循环交换为例阐述了其形式化描述方法。
  • 目录14.4 循环优化 14.4 循环优化 经验告诉我们: “程序运行时间的80%是由仅占源程 序20%的部分执行的”。 ——二八定律 (Pareto Principle) 这20%的源程序就是循环部分,特别是多重循环的最 内层的循环部分。因此...
  • JavaScript性能优化——循环优化

    千次阅读 2019-05-18 16:22:24
    循环是我们在写代码时经常用到的一种结构,而往往在考虑性能优化时,循环优化能带来很大的收益,特别是当我们不得不循环多次时,如果没对性能进行优化,那毫无疑问会带来性能的负担。 循环的类型 1.for循环 for...
  • 前端性能优化:循环优化

    千次阅读 2016-07-01 16:02:33
    近段时间在处理前端性能的优化,而优化的重点自然是循环的处理,循环优化吗?可以肯定的是可以优化。核心是数组长度外提,去掉必要的判断。另外避免使用for in的循环,更不要使用封装过的循环。使用基本的for循环...
  • JavaScript循环优化

    2020-06-08 09:54:10
    在此视频中,我们将介绍一些我们可以采取的步骤,以优化我们的for循环,使它们尽可能地表现出色。 我们将通过使用演示Web应用程序,带有测试的三个不同浏览器以及示例代码来实现此目的。 观看视频 快速回顾 回想...
  • list循环多重循环优化

    2020-05-14 17:08:34
    List,String>> list = new ArrayList(); //造数据 for(int i = 0;i;i++){ Map,String> m = new HashMap(); list.add(m);...利用map来进行获取 获取数据 效率要高于使用循环处理 尽量避免在循环中运算
  • C++循环优化

    2020-03-22 20:53:07
    循环变量前面加上“register”,有的时候可以加一点点速度,但不一定管用,如: for(register int i=1;i<=n;i++)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,123
精华内容 5,649
关键字:

循环优化