`

Js性能优化--循环体优化

    博客分类:
  • Js
阅读更多
最近一直在看js相关资料,看到一些关于如何提高js性能方面的资料,故和大家分享下:
众所周知Js中的循环大致可以分为4中:
1.for循环
   for(var i=0;i<10;i++){
     //循环主题
   }

其中for循环是最常见的循环结构,由四部分组成:初始化、前测条件、后执行体、循环体。当代码运行遇到for循环时,先运行初始化代码,然后进入前侧条件。如果前侧条件为true,则运行循环体。循环体执行完后,后执行代码开始运行。
2. while 循环 
while循环是最简单的前测循环,有一个前测条件和一个循环体构成:
   var  i = 0;
   while(i < 10){
      //循环主题
      i++;
   }

3. do..while循环 
do-while 循环是js中唯一一种后测循环,由两部分组成,循环体和后测条件
    var i = 0;
    do{
        //循环体
    }while(i++ < 10)

在do-while中至少会执行一次循环体
4 for-in循环
该循环有一个特别的用途:可以枚举任何对象的属性名。
    for(var prop in object){
       //循环体
    }

循环体每次运行时,prop变量被赋值为object的一个属性名,直到所有属性遍历完成才返回。所返回的属性包括对象实例属性和从原型链中继承而来的属性

以后对4中循环进行了大致的介绍,接下来说说如何在进行相关系能提升
4中循环类型中,只有for-in循环比其他几种明显要慢:主要原因在于每次迭代操作会同时搜索实例或原型属性,每次迭代都会产生更多开销。

如果循环类型与性能无关,可以从以下两个可选因素来提高整体性能
1.每次迭代处理的事务
2.迭代的次数

减少迭代的工作量
很明显,如果一次循环迭代要花很长时间去执行,那么多次循环需要花更多的时间。一个提升循环整体速度的好方法就是限制循环中耗时的操作数量。
一个典型的数组处理循环可以采用三种循环中的任何一种。最常见的写法如下:
   for(var i = 0; i < items.length; i++){
       process(items[i]);
   }
  
   var j = 0;
   while(j < items.length){
       process(items[j]);
   }

   var k = 0;
   do{
      process(items[k]);
   }while(k < items.length);
 

   上面的每个循环中,每次进行循环体时都会产生如下操作:
   1. 一次控制条件中的属性查找(items.length)
   2. 一次控制条件中的数值大小的比较(i<items.length)
   3. 一次控制条件结果是否为true的比较(i<items.length == true)
   4. 一次自增操作(i++)
   5. 一次数组查找(items[i])
   6. 一次函数调用( process(items[j]);)

   这些简单循环中,尽管代码不多,但每次迭代都要进行许多操作。代码运行速度很大晨读上取决于函数process()对每个数组项的操作,尽管如此,减少每次迭代中的操作能大幅提高循环的整体性能。
   优化循环的第一步就是减少对象成员及数组项的查找次数。前面例子中每次循环都要查找items.length,这样做很耗时,由于该值在循环运行过程中从未变过,因此产生了不必要的性能损失,提高整个循环的性能很简单,只查找一次属性,并把值存储到一个局部变量中,然后在控制条件中使用整个变量
   for(var i = 0,len = item.length; i < len; i++){
       process(items[i]);
   }
  
   var j = 0,
       len = items.length;
   while(j < len ){
       process(items[j]);
   }

   var k = 0,
       num = items.length;
   do{
      process(items[k]);
   }while(k < num);
 


   还可以通过倒序循环来进行。

减少迭代次数
  
   即使是循环体中最快的代码,累计迭代上千次也会慢下来。此外,循环体运行时也会带来小性能开销,不仅仅是增加总体运行时间。减少迭代次数能获得更加显著的性能提升。下面介绍一种广为人知的限制循环迭代次数的模式被称为“达夫设备(Duff's Device)”:
   Duff's Device 是一个循环体展开技术,使得一次迭代实际执行了多次迭代的操作
  
   var iterations = Math.floor(items.length/8),
       startAt = items.length%8,
       i = 0;
   do{
       switch(startAt){
           case 0 : process(items[i++]);
           case 7 : process(items[i++]);
           case 6 : process(items[i++]);
           case 5 : process(items[i++]);
           case 4 : process(items[i++]);
           case 3 : process(items[i++]);
           case 2 : process(items[i++]);
           case 1 : process(items[i++]);
       }
       startAt =  0;
    }while(--iterations);

 


分享到:
评论

相关推荐

    js 优化次数过多的循环 考虑到性能问题

    出现这种情况,首先想到的是优化循环体。但明显地,循环体很简单,没什么优化的余地。即使把循环体清空,提示仍然存在。于是,我得出了一个结论:在IE下,一旦循环次数超过了某个特定值,就会弹出停止脚本的提示。 ...

    SE2019春-G11-编码规范1

    1. 大循环体性能优化:for循环体要先将循环次数放到一个变量中,避名大循环体下多次取值影响性能://错误的写法 for(var i = 0 3.js面向对象开

    SE2019春-G11-编码规范2

    1. 大循环体性能优化:for循环体要先将循环次数放到一个变量中,避名大循环体下多次取值影响性能://错误的写法 for(var i = 0 3.js面向对象开

    jeffplourd.github.io

    网站性能优化组合项目 要运行此应用程序,请转到“ ” 此应用程序代表了多种性能优化技术。 在“index.html”文档中,我执行了以下优化: -添加元标记以确保初始加载时正确的视口 -使用字体加载器以减少谷歌字体...

    Frontend-nanodegree-websiteoptimization1:披萨网站

    网站性能优化组合项目在 Index.html 中所做的更改1.内联print.css。 2.inline style.css。 3.使用字体优化字体。 4.压缩比萨店形象。 5.使用异步脚本标签。 在 main.js 中所做的更改1. 移除 document.queryselector ...

    performance-optimization:执行优化以60fps呈现页面

    #性能优化 该项目提供了以下优化措施,以实现60fps的渲染速度和至少90的Google Page Speed得分。 index.html的更改摘要: 删除了Google字体 使analytics.js和perfmatters.js异步 添加媒体查询以打印样式表 使用...

    nanodegree-p4-website-optimisation:nanodegree-p4-网站优化

    ============================ 网站优化提交 ...图像压缩-JS 脚本缩小并放置在每个页面的底部-CSS 脚本...CSS,结合 style.css 并缩小结果- 使用 chrome dev 工具图像压缩缩小图像- 通过不每次都检查宽度来提高循环性能-s

    javascript性能问题

    3、优化循环:减值迭代,简化终止条件,简化循环体,后测试循环; 4、展开循环; 5、尽可能避免出现需要按照javascript解释的字符串; 6、原生方法较快; 7、switch语句比if-else快 8、位运算符较快、 9、用一个var...

    frontend-nanodegree-mobile-portfolio-master

    网站效果优化组合项目 挑战在于优化此在线产品组合以提高速度。 特别是,通过应用我在“的技术,优化关键渲染路径,并使此页面尽快。 index.html的更改 使用本地服务器映像文件可以更快地加载它们。 使用较小的图像...

    fn-mobile-portfolio:Udacity 前端开发纳米学位 PR4

    删除了谷歌字体的使用来自 style.css 的内联 css 从 CRP 中排除了 print.css(添加 media="print") 添加了对脚本的异步调用(perfmatters.js、analytics.js) 优化的图像(压缩、调整大小)第二部分 - 60 FPS 前做...

    udportfolio_3

    该应用程序引用了网站性能优化组合项目。为了运行该应用程序,您需要在dist文件夹中打开文件index.html。 在index.html中,点击Cam's Pizzeria链接以访问pizza.html文件 在index.html文件中进行的优化 为了满足...

    udacity-p4-website-optimization:优达学城前端开发者纳米学位

    项目四:网站性能优化 第 1 部分:index.html 结果 手机:92/100 台式机:94/100 所做的更改 将脚本移到底部 将外部脚本加载更改为异步 优化图片并移除外部图片托管 将字体加载切换到 javascript 缩小 js 和 css ...

    WKE WebUI基本组件演示,使用了LayUI框架标题栏整体窗口UI演示-易语言

     渲染性能优化  增加一些不支持特性的兼容性  增加401验证回调接口: wkeOnResponseHttp401 2016-12-06:  修正手形鼠标  修正wkeWindowOnPaint返回值的默认处理  修正编辑事件  修正输入法位置 2016-11-15:  ...

    DotNetTextBox所见即所得编辑器控件 v3.3.1

    6) 优化了非IE浏览器下的脚本性能。 7) 将编辑器设置为在缩放或移动过程中持续更新元素外观,以达到更好的所见即所得效果。 8) 增加插入图片的路径类型选择功能,可通过ImgPathType内置的属性选择插入图片...

    Java面试宝典-经典

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    Java面试宝典2010版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 57、介绍Collection框架的结构 58、Collection框架中实现比较要实现什么接口 59、...

    最新Java面试宝典pdf版

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    Java面试笔试资料大全

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

    超实用的jQuery代码段

    11.18 最优化的循环语句写法 11.19 如何构建最优化的字符串 11.20 使用jQuery产生GUID值 11.21 使用jQuery实现聚合函数 11.22 用jQuery打印网页的特定区域 11.23 禁止表单被提交 11.24 使用delay()延迟执行动画 ...

    JAVA面试宝典2010

    56、子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,接着再回到主线程又循环100,如此循环50次,请写出程序。 38 57、介绍Collection框架的结构 43 58、Collection框架中实现比较要实现什么接口 43 ...

Global site tag (gtag.js) - Google Analytics