前端js优化方案(二)持续更新

由于上篇篇幅过长,导致编辑出了问题,另开一篇文章继续:

4)减少迭代次数,最广为人知的一种限制循环迭代次数的模式被称为“达夫设备(Duff`s Device)”

 

 

Duff`s Device的理念是:每次循环最多可以调用8process()。循环的迭代次数为总数除以8由于不是所有数字都能被8整除,变量startAt用来存放余数,表示第一次循环应该循环多少次。假设总次数为12,则余数为4,代表第一次循环会调用4次process(),第二次循环startAt至为0,循环8次,这样就用两次循环代替了12次循环。(感觉这个方法还是很好的,以后工作中必然用的到)

第二个版本经过了优化,用while取代了switch,将余数与主循环分开:

这种方式用两次循环代替了之前的一次徐循环,但是它移除了循环主体中的switch语句,速度比原始循环还快。

不过使用这种方式目的是提高性能,要是循环次数本身就比较少,使用这种方式的效果并不明显,以1000次循环为一个分界点,如果超过1000次循环,那么这样的执行效率就会明显提升。

5forEach():此方法便利一个数组的所有成员,并在每个成员上执行一个函数。要运行的函数作为参数传给forEach(),并在调用时接收三个参数,分别是:当前的数组项的值、索引以及数组本身。

Items.forEach(function(value,index,arry){ process(value);})

总结:在所有情况下,基于循环的迭代比基于函数的迭代法快8倍;

(二)条件

1If-else对比switch

大多数情况下switch比if-else运行要快;

2、if-else优化

(1)if-else中的条件语句应该总是按照从最大概率到最小概率的顺序排列,以确保运行速度最快。

(2)如果一个条件语句需要判断10次以上,为了最小化条件判断的次数,代码可以重写为一系列嵌套的if-else语句;这个适用于多个值域需要测试,单如果是离散值的话,用switch语句更合适;

(三)查找表

当使用查找表示,必须完全抛弃条件判断语句。这个过程变成数组项查询或对象成员查询。当单个键和单个值之间存在逻辑映射时,查找表的优势就能体现出来,switch语句更适合与每个键都需要对应一个独特的动作或一系动作的场合。

(四)递归

使用递归可以把复杂的算法变得简单。但是潜在问题是终止条件不明确或缺少终止条件会导致函数长时间运行,并使得用户界面处于假死状态;

(五)、迭代算法

任何递归能实现的算法同样可以用迭代来实现。迭代算法通常包含几个不同的循环,分别对应计算过程的不同方面,虽然这样会引入他们自身的问题,但是运行一个循环比反复调用一个函数的开销要少很多

(六)、Memoization

Memoization他缓存前一个计算结果提供后续使用,避免重复工作。

重写递归阶乘函数,防止重复执行

今天就更新到这里,后续还会继续更新。。

 

posted @ 2017-09-19 15:42  Leo_geng  阅读(382)  评论(0编辑  收藏  举报