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

      

  • 相关阅读:
    HDU 1075 What Are You Talking About(字典树)
    HDU 1075 What Are You Talking About (stl之map映射)
    HDU 1247 Hat’s Words(字典树活用)
    字典树HihoCoder
    HDU 1277全文检索(字典树)
    HDU 3294 Girls' research(manachar模板题)
    HDU 3294 Girls' research(manachar模板题)
    HDU 4763 Theme Section(KMP灵活应用)
    Ordering Tasks UVA
    Abbott's Revenge UVA
  • 原文地址:https://www.cnblogs.com/94pm/p/11197176.html
Copyright © 2011-2022 走看看