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

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

  

最新文章

  1. word20161213
  2. npm 替换为 cnpm
  3. [XenServer] XenServer修改IP 以及 root密码
  4. 那些年被我坑过的Python——你来我往(第九章 selectors)
  5. extjs中rowEditing动态编辑
  6. delphi 操作 TWebBrowser 实现自动填表(JQuery脚本与 OleVariant 方法)
  7. 利用WinDbg找出程序崩溃的代码行号
  8. 2014在辛星Javascript口译科
  9. 为什么重写equals()必须重写hashCode()
  10. Android NDK开发及调用标准linux动态库.so文件
  11. yii2高级模板使用一个域名管理前后台
  12. php java aes
  13. Navicat Win 和 Mac 视图类快捷键对比
  14. Python全栈之路----数据类型—元组类型
  15. python之路——5
  16. erlang随机数问题
  17. [leetcode] 4. Path Sum
  18. AI篇6====&gt;第一讲
  19. 杂谈PID控制算法——第一篇:三个量
  20. 用canvas实现鼠标拖动绘制矩形框

热门文章

  1. 获取并打印Spring容器中所有的Bean名称
  2. ES6深入浅出-3 三个点运算 &amp; 新版字符串-1.函数与对象的语法糖
  3. DateUtil 提供一些常用的时间想法的方法
  4. linux添加动态库路劲
  5. Qt5.10使用了qml后打包发布应用遇到的问题
  6. Django Model 定义语法
  7. python编程中的一些有用插件或工具
  8. Fastjson 序列化与反序列化
  9. 【嵌入式硬件Esp32】Ubuntu 1804下ESP32交叉编译环境搭建
  10. 玩转CONSUL(2)–分布式锁