zoukankan      html  css  js  c++  java
  • js展开循环

    当要对一个大数组进行循环时,通常会通过局部变量缓存数组长度来提高性能,例:

    for(var i=0,len=arr.len;i<len;i++){}

    光是缓存数组长度或使用倒序遍历来减少判断外,另一个优化手段就是减少循环次数,减少循环次数使用的是duff's  device算法,算法原理如下:

    通过将 values 数组中元素个数除以 8 来计算出循环需要进行多少次迭代。然后使用取整的上限函数确保结果是整数。如果完全根据除 8 来进行迭代,可能会有一些不能被处理到的元素,这个数量保存在 startAt 变量中。首次执行该循环时,会检查 StartAt 变量看有需要多少额外调用。例如,如果数组中有 10 个值,startAt 则等于 2,那么最开始的时候 processer()则只会被调用 2 次。在接下来的循环中,每次循环都会调用 8 次 process()。展开循环可以提升大数据集的处理速度。

    以下是优化版的duff's算法

     const arr=Array.from({length:20},(value,key)=>key+1) //从1开始,生成length个元素
            const len=arr.length,startAt=len%8,loopCount = Math.floor(len/8),i = 0
            //不够8个的,独立循环
            while(startAt--){
                processer(arr[i++])
            }
            //8个一组,执行一次循环
            while(loopCount--){
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])
                processer(arr[i++])   
            }
            function processer(value){
                console.log(value)
            }
    

      

  • 相关阅读:
    xx系统需求分析第七稿--权限管理(一)
    第四周学习进度总结
    hbase的Shell命令操作
    软件需求最佳实践读书笔记一
    hbase的Java基本操作
    Java 面向对象编程之接口
    Java 面向对象编程之继承的super关键词
    Java核心基础之数据类型
    Java 导出Excel
    JavaSE基础知识之修饰符和使用场景,你真的了解嘛
  • 原文地址:https://www.cnblogs.com/94pm/p/11197176.html
Copyright © 2011-2022 走看看