手机版

js性能优化算法和过程控制

时间:2021-09-06 来源:互联网 编辑:宝哥软件园 浏览:

循环处理是最常见的编程模式之一,也是提高性能必须注意的要点之一。

常见的优化方案有:

在四种JavaScript循环(for、do-while、while、for-in)中,for-in循环明显慢于其他循环。因为每次迭代都会同时搜索实例或原型属性,所以for-in循环的每次迭代都会产生更多的开销,因此它比其他类型慢。因此,遍历具有有限数量属性的已知属性列表可以优化如下:

var props=['prop1 ',' prop2'],I=0;whlie(I props . length){ press(object[props[I]]);}这段代码只关注给定的属性,减少了循环的开销。

一会儿,一会儿。我在chrome下测试了一下,首先创建一个大小为1,000,000的数组,将每个项目乘以100,然后叠加。

测试案例:

window . onload=function(){ var items=Array(1000000)。连接(',')。拆分(',')。map(函数(项,索引){ return index});console . log(for circle())console . log(while circle())console . log(Docircle())函数for circle(){ console . profile();var currTime=新日期();var tal=0;for(var I=0;一.项目.长度;i ){ tal=tal流程(项目[I]);} console . profile end();console . log(' for circle time:“(new Date()-curr time)' ms ');返回tal}函数while ecrcle(){ console . profile();var currTime=新日期();var tal=0;var j=0;while(j items . length){ tal=tal process(items[j]);} console . profile end();console . log(' while circle time:“(new Date()-curr time)' ms ');返回tal} function Docircle(){ console . profile();var currTime=新日期();var tal=0;var k=0;do { tal=tal process(items[k]);} while(k items . length)console . profile end();控制台。日志(' doccycle使用的时间:'(new Date()-curr time)' ms ');返回tal}功能流程(项目){返回项目* 100;}}获取测试结果:

平均来说,循环需要8毫秒,while需要4毫秒,doWhile需要4毫秒。因为是最慢的。

减少迭代的工作量。将数组长度保存在局部变量中,然后遍历并反转数组的遍历顺序。

最常见的循环:

for(var I=0;一.项目.长度;i ){流程(项目[I]);}//var j=0;while(j items . length){ process(items[j]);}//var k=0;do { process(items[k]);}在此循环中(k items.length ),每次运行将产生以下操作:

(1)找到一个属性(items.length)

进行一次数值比较(I项.长度)

检查控制条件是否为真(I项,长度==真)

(4)自增操作(一)

数组搜索(项目[i])

函数调用(流程(项目[i])

如果数组长度存储在局部变量中,则不必每次都查找items.length,这样可以提高性能。

改为如下:

for(var i=0,len=items.length我透镜;i ){流程(项目[I]);}//var j=0,count=items.lengthwhile(j count){ process(items[j]);}//var k=0,num=items.lengthdo { process(items[k]);}while (k num)在大多数浏览器中可以节省大约25%的运行时间(在IE中甚至可以节省50%)。一般来说,当周期数较大时,运行时间确实有所改善。取某个结果如下:

当没有本地库存来存储数组长度时:

当存在存储数组长度的局部变量时:

减少迭代次数,“Duffs Device”意为“Duff device”循环展开技术。它适用于大量迭代的情况。

摘录书中Duff设备的基本思想:process()函数在每个循环中最多可以调用8次。循环迭代次数是元素总数除以8。因为总数不一定是8的整数倍,所以startAt变量存储余数,指示在第一个循环中应该执行多少次process()。例如,如果现在有12个元素,第一个循环将调用process()4次,第二个循环将调用process()8次,第二个循环将替换12个循环。

基本模式:

var迭代=Math.floor(items.length/8),startAt=items.length%8,I=0;do { switch(startAt){ case 0 : process(items[I]);案例7 :流程(项目[I]);案例6 :流程(项目[I]);案例5 :流程(项目[I]);案例4 :流程(项目[I]);案例3 :流程(项目[I]);案例2 :流程(项目[I]);案例1 :流程(项目[I]);} startAt=0;} while(-iterations);基于函数的迭代比基于循环的迭代消耗更多的性能。示例:对于循环迭代和forEach函数迭代。

优化if-else。一般来说,switch比if-else快,但是当判断条件较多时,使用查找表比if-else和switch快。

以上就是本文的全部内容。希望本文的内容能给大家的学习或工作带来一些帮助,也希望多多支持我们!

版权声明:js性能优化算法和过程控制是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。