当前位置: 首页 > Web前端 > HTML

高性能JavaScript阅读简述(三)

时间:2023-04-02 19:20:38 HTML

四.AlgorithmsandFlowControl算法与流程控制1.Loops循环a.避免使用for/in循环在JavaScript标准中,有四种类型的循环。for,for/in,while,do/while,性能明显比其他的慢的只有for/in。对于for/in循环的使用场景,更多的是针对内部结构不确定的对象的循环。for/in会枚举对象的具名属性,只有遍历完对象的所有属性,包括实例属性和从原型链继承的属性,循环才会返回。因为for/in循环需要查找实例或者原型的属性,for/in的性能要差很多,所以我们要尽量避免使用for/in循环。对于具有已知属性列表的对象,我们需要避免使用for/in。b。减少每次迭代的工作一个标准的for循环包括:(初始化体;前端条件/控制条件;执行后体){循环体;}也许对于单个循环操作,我们所做的性能优化似乎没有帮助很大,但对于许多循环,这些性能优化加起来会很明显。for(vari=0;i1&&result<=3){//二等奖}elseif(result>3&&result<=6){//三等奖}else{//没有中奖}其实最有可能的是没有中奖,但是每次都需要先做前三个判断才可以判断你不是赢家,这时候可以做的优化就是把上面的写法反过来:varresult=Math.random()*10;if(result<=4){//没有中奖}elseif(result>4&&result<=7){//三等奖}elseif(result>7&&result<=9){//二等奖}else{//一等奖}当然,如果性能更现实,这里还是用switch比较好,但是我们考虑的是优化if-else的性能。另一种减少条件判断长度的方法是将并列的if-else判断组织成嵌套的if-else,以减少条件判断的平均长度。例如下面的例子:varresult=Math.floor(Math.random()*10);if(result===0){return0;}elseif(result===1){return1;}elseif(result===2){return2;}elseif(result===3){return3;}elseif(result===4){return4;}elseif(result===5){return5;}elseif(result===6){return6;}elseif(result===7){return7;}elseif(result===8){return8;}elseif(result===9){return9;}这时候计算条件体的最大个数为9,我们可以通过嵌套判断来减少判断次数:if(result<6){if(result<3){如果(结果===0){返回0;}elseif(结果===1){返回1;}else{返回2;}}else{如果(结果===3){返回3;}elseif(result===4){返回4;}else{返回5;}}}else{如果(结果<8){如果(结果===6){返回6;}else{返回7;}}else{如果(结果===8){返回8;}else{返回9;}}}好像代码太多了,但是条件判断的最大数量变成了4,一定程度上提高了性能。当然,这种情况下一般使用swtich来处理。C。LookupTables查找表法当有大量离散值需要测试时,从可读性和性能上考虑不宜选择使用if-else或switch,比如下面这种情况:vararray=[0,1,2,3,4,5,6,7...];开关(结果){情况0:返回数组[0];情况1:返回数组[1];情况2:返回数组[2];情况3:返回数组[3];案例4:返回数组[4];案例5:返回数组[5];案例6:返回数组[6];...}当数组有几十条或几百条数据时,switch语句将是非常大的一段代码。这时候可以使用查表的方法:vararray=[0,1,2,3,4,5,6,7...];返回数组[结果];查表法一般适用于数据量稍大的场合,在实际编程中经常使用这种方法。d.递归在某些场合,比如阶乘函数,递归调用无疑是最好的实现方式:functioncalc(n){if(n===0){return1;}else{returnn*calc(n-1);}}e、Memoization制表制表的原理是通过缓存已经运行过的计算结果来提高性能,避免后续重复计算。也常用于递归运算,如上面阶乘函数的调用:vara=calc(10);变量b=计算(9);变量c=计算(8);当调用calc(10)时,已经计算完calc(9)和calc(8)的值,这里calc(9)重新计算了两次,而calc(8)重新计算了三次,我们可以优化一下它通过缓存计算结果:functionm(n){if(!m.c){m.c={"0":1,"1":1};}if(!m.c.hasOwnProperty(n)){m.c[n]=n*m(n-1);}返回m.c[n];}vare=m(10);varf=m(9);varg=m(8);在优化后的函数中,m(9)和m(8)不再进行计算,避免了重复计算。高性能JavaScript阅读简介(一)高性能JavaScript阅读简介(二)高性能JavaScript阅读简介(三)