js展开循环
2024-10-06 06:03:33
当要对一个大数组进行循环时,通常会通过局部变量缓存数组长度来提高性能,例:
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)
}
最新文章
- word20161213
- npm 替换为 cnpm
- [XenServer] XenServer修改IP 以及 root密码
- 那些年被我坑过的Python——你来我往(第九章 selectors)
- extjs中rowEditing动态编辑
- delphi 操作 TWebBrowser 实现自动填表(JQuery脚本与 OleVariant 方法)
- 利用WinDbg找出程序崩溃的代码行号
- 2014在辛星Javascript口译科
- 为什么重写equals()必须重写hashCode()
- Android NDK开发及调用标准linux动态库.so文件
- yii2高级模板使用一个域名管理前后台
- php java aes
- Navicat Win 和 Mac 视图类快捷键对比
- Python全栈之路----数据类型—元组类型
- python之路——5
- erlang随机数问题
- [leetcode] 4. Path Sum
- AI篇6====>;第一讲
- 杂谈PID控制算法——第一篇:三个量
- 用canvas实现鼠标拖动绘制矩形框