`

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);

 


分享到:
评论

相关推荐

    javascript经典特效---状态栏循环文字.rar

    7. **性能优化**:为了保证用户体验,需要确保代码执行效率,避免过度渲染导致页面卡顿。例如,使用requestAnimationFrame来代替setInterval进行动画更新,以更好地同步浏览器的重绘周期。 8. **错误处理**:良好的...

    JavaScript性能优化的小知识总结共23页.pdf

    7. **优化循环**:合理使用for、while等循环结构,避免在循环体内部进行不必要的计算或DOM操作。 8. **使用let和const替代var**:var可能导致变量提升和作用域污染,而let和const能更好地控制作用域,有助于优化...

    .NET 性能优化方法总结

    - **1.7.7 避免在循环体里声明变量**:在循环体内部声明的变量会在每次迭代时重新创建,这会增加不必要的内存分配。 **1.8 Hashtable** - **1.8.1 Hashtable机理**:理解哈希表的工作原理可以帮助我们更有效地使用...

    大型网站性能优化实战从前端网络CDN到后端大促的全链路性能优化

    在构建和运营大型网站时,性能优化是至关重要的,它直接影响到用户体验、网站的可扩展性和业务的成功。本文将深入探讨从前端网络CDN到后端大促的全链路性能优化策略,以提高网站的加载速度、响应时间和整体效率。 ...

    JavaScript性能优化技巧分享共8页.pdf.zip

    15. **优化循环**:避免在循环体中进行不必要的计算,可以使用for-of替代for循环遍历数组,或者使用Array.prototype.forEach。 16. **避免阻塞主线程**:尽量将耗时操作放在Web Worker中执行,避免阻塞UI更新。 17...

    性能优化手册100技巧.06版.pdf

    - **try-catch的合理使用**:在循环体内部避免使用try-catch,因为异常捕获操作是有性能开销的。 - **优化HashMap**:理解和使用HashMap的不同遍历方式,根据实际需求选择最高效的遍历方法。 - **Java应用的GC优化**...

    javascript经典特效---多层超酷导航条.rar

    总的来说,“javascript经典特效---多层超酷导航条.rar”这个资源提供了一个学习JavaScript动态效果和交互设计的实例,涵盖了从基础的DOM操作到高级的性能优化等多个方面。通过研究和实践这个案例,开发者不仅可以...

    threejs-impact-checking.7z

    8. **优化**:对于性能敏感的项目,可能需要考虑优化策略,如减少渲染的物体数量,使用LOD(Level of Detail)技术,或者预计算碰撞数据等。 综上所述,"threejs-impact-checking.7z"很可能是包含了一个使用Three....

    JavaScript提高网站性能优化的建议(二)_.docx

    循环是另一种常见的流控制语句,优化循环结构对于性能优化也很重要。例如,避免在循环体内部修改数组长度,因为这可能会导致重新计算索引,降低循环性能。同时,尽量减少循环中的计算量,将计算移到循环外部或使用...

    深入理解Javascript中的循环优化

    在循环中,减少循环体内部的操作也是优化循环效率的途径之一。如果循环的业务逻辑允许,可以考虑倒序循环(即计数器递减到0)来减少循环次数。这样做,可以在一定程度上减少循环体内部的迭代次数,从而提升执行效率...

    .net性能优化宝典

    **1.7.7 避免在循环体里声明变量** 在循环体内部声明变量会增加GC的压力,应尽量避免。 #### 1.8 Hashtable **1.8.1 Hashtable机理** `Hashtable`是一种基于哈希表的数据结构,用于存储键值对。理解其内部实现有...

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

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

    JavaScript-Loops-源码.rar

    此外,为了优化性能和避免无限循环,我们还需要了解如何正确使用break和continue语句。`break`用于立即退出循环,而`continue`则跳过当前循环的剩余部分,直接进入下一次循环。 总结一下,JavaScript的循环机制是...

    javascript经典特效---全球时间表.rar

    9. **性能优化**:对于大量时间数据的处理,应考虑性能优化,比如使用节流(throttle)或防抖(debounce)技术减少不必要的计算,或者利用Web Workers进行后台计算以避免阻塞主线程。 10. **可维护性**:良好的代码...

    for循环简单操作 数字的遍历

    在JavaScript(JS)中,`for`循环是一种常用的控制流程结构,用于重复执行一段代码,直到满足特定条件为止。这个循环通常由三个部分组成:初始化、条件检查和更新,这三部分分别用圆括号中的单次表达式、条件表达式...

    javascript经典特效---字符从天而降.rar

    6. **性能优化**:为了保证在大量字符下落时的流畅性,可以使用requestAnimationFrame API来替代定时器,它能更有效地同步动画与浏览器的重绘周期。 总的来说,"字符从天而降"的JavaScript特效是一个结合了HTML、...

    js日历控件-calendar.js

    9. **性能优化**:如果日历控件包含大量数据(如节假日、特殊日期等),则需要考虑性能优化,如延迟加载、虚拟滚动等技术。 10. **国际化支持**:对于多语言环境,日历控件可能需要支持日期格式的国际化,包括日期...

    深入探究JavaScript中for循环的效率问题及相关优化

    然而,传统的for循环在处理复杂逻辑或大数据集合时可能会影响脚本的执行效率,优化循环的效率对于提高代码性能至关重要。 首先,传统的for循环的效率问题主要体现在两个方面:一是循环体内部代码的执行时间;二是...

Global site tag (gtag.js) - Google Analytics