循环语句
众所周知,常用的循环语句,而DO-WHILE,和,foreach。除了在
性能略低,foreach中,我们通常选择第一个三基于需求而不是性能的考虑。今天,我们将测试它们各自的性能,并告诉我们在最极端的
情况下我们能做什么
优化。
首先让我们来谈谈为什么在foreach比others.for-in一般用在对对象的
属性名称的遍历
速度较慢,因为每个迭代也将
搜索实例本身属性和原型链的属性,所以效率肯定是低的;而每一个基于迭代
函数(特别注意的是,所有版本IE并不需要如果需要可以使用jQuery库的
支持下,),使每项调用外部
方法是架空的速度慢的主要
原因。
那么让我们看看,同时,在每一次迭代和DO-WHILE做。
VaR的长度= items.length;
对于(var i = 0;i <长度;i + +)
过程(项目{ });
var j=0;
同时(j <长度)
进程(项目{ + });
var = 0;
{做
进程(项目{ + });
}(k <长度);
在上面的每一个循环中,每次循环
运行时都会产生这样的
操作:
在一个
控制条件下的值的比较(i <长度)
控制条件的比较。结果是真的(我长度= TRUE)
一次自增
运算(++)
主数组查找(项目{ })
一个函数调用过程(项目{ })
我们可以通过反转数组的
顺序来改善循环性能。
对于(var i = items.length;我--;)
过程(项目{ });
var j = items.length;
(J)
进程(项目{ });
var k = items.length - 1;
{做
过程(项目{ });
}(k);
在这种情况下使用的反循环,并在整合下减法操作。现在每个控制只与0相比,控制条件和真正的价值,任何非零的数将被自动
转换为真实的,和零等同于虚假的。事实上,控制条件是从两个比较(叠加代数是少于总数这是真的吗减少到比较(是真的吗)每次迭代从两个减少到一个,循环速度进一步改进。
性能测试:
事实真的如此吗真正的黄金不怕
浏览器。测试代码非常简单,封装了8种
功能,用于8种不同的情况(没有计时器Firefox不能
打印配置文件信息,原因不明):
初始化数组
var = { };
var长度= 10;
对于(var i = 0;i <长度;i + +)
{ }=1;
功能for_in(){
var总和= 0;
为(var I)
总和= { };
}
功能for_each(){
var总和= 0;
a.foreach(功能(价值指数、阵列){
总和=值;
});
}
功能for_normal(){
var总和= 0;
对于(var i = 0;i <长度;i + +)
总和= { };
}
功能for_reverse(){
var总和= 0;
对于(var i =长度;i;;)
总和= { };
}
功能while_normal(){
var总和= 0;
var I=0;
同时(i <长度)
总和= { } + };
}
功能while_reverse(){
var总和= 0;
变量长度;
(i)
总和= { };
}
功能do_while_normal(){
var总和= 0;
var I=0;
{做
总和= { } + };
}(i <长度);
}
功能do_while_reverse(){
var总和= 0;
var i =长度- 1;
{做
总和= { };
}(i);
}
setTimeout(){()函数(
Console.profile();
for_in();
for_each();
for_normal();
for_reverse();
while_normal();
while_reverse();
do_while_normal();
do_while_reverse();
Console.profileEnd();
},1000);
当数组的长度为100时,我们
发现Firefox的结果与预期的相似,并且对于每一个
都是低效的,其效率比反向稍微高一些。
当数据量达到100W,Firefox和Chrome下的结果都是一样,人们想要什么,但他们都略有不同,在下FF的行为比每个,和在表现下,铬是有害的,并提出了一种直接的警告,虽然性能略有提高。反向迭代,但增加不多,和降低代码的阅读。
总结:
可以稍微提高反向迭代代码的性能,但牺牲可读性,除非追求极端性能优化的情况下还是没有必要的。
遍历数组可以使用一个公共循环,而不是用于每个和每个循环。
二、条件语句
常见的条件语句是如果有其他情况和开关情况,那么当
什么时候使用,什么时候使用开关case语句
让我们看看一个简单的if语句的代码。
如果(值= 0){
返回result0;
{ { if(值= 1)
返回结果;
{ { if(值= 2)
返回2;
{ { if(值= 3)
返回结果;
{ { if(值= 4)
返回result4;
{ { if(值= 5)
返回结果;
{ { if(值= 6)
返回结果;
{ { if(值= 7)
返回结果7;
{ { if(值= 8)
返回result8;
{ { if(值= 9)
返回result9;
{人}
返回result10;
}
在最坏的情况下(值= 10),我们可能需要做出10个判断来返回
正确的结果,那么我们如何优化代码呢一个明显的优化
策略是预先判断最有可能的值,例如值最可能是5或10,然后两个判断提前,但通常我们不知道(最可能的选择),当我们可以使用两个树搜索策略来进行性能优化时。
如果(值< 6){
如果(值< 3){
如果(值= 0){
返回result0;
{ { if(值= 1)
返回结果;
{人}
返回2;
}
{人}
如果(值= 3){
返回结果;
{ { if(值= 4)
返回result4;
{人}
返回结果;
}
}
{人}
如果(值< 8){
如果(值= 6){
返回结果;
{人}
返回结果7;
}
{人}
如果(值= 8){
返回result8;
{ { if(值= 9)
返回result9;
{人}
返回result10;
}
}
}
经过优化,我们可以让最多4的判断,大大提高代码的性能。这种优化思想是两点查找有点相似的,类似的两点查找,只有当的值是一个
连续的号码可以被优化。但写在这这样的代码是不利于
维护。如果我们想添加一个条件或多个条件,我们需要重写许多代码。在那个时候,可以应用开关case语句。
用开关case语句重写上面的代码:
开关(值){
案例0:
返回result0;
案例1:
返回结果;
案例2:
返回2;
案例3:
返回结果;
案例4:
返回result4;
案例5:
返回结果;
案例6:
返回结果;
案例7:
返回结果7;
案例8:
返回result8;
案例9:
返回result9;
违约:
返回result10;
}
的开关情况语句使代码更具可读性,和使用case语句的好处是,如果多个值返回相同的结果,没有必要重写返回代码的一部分。一般来说,当案件数量达到一定的数量,使用case语句的效率高于如果别的,因为开关箱采用分表(分表)指标优化,当然,浏览器的优化程度也不同。
除了if else和开关的情况下,我们也可以使用查找表。
VaR结果= { result0,1,2,结果,result4,结果,结果,结果7,result8,result9。
返回正确的结果
返回结果{值};
当数据量较大时,查找表的效率一般高于if-else语句和使用情况报表。查找表可以通过数字和字符串进行索引,如果是字符串,最好使用对象而不是数组。当然,查找表的使用是有限的,每个案例的结果只能是一个值,而不是一系列操作。
总结:
当只有两个或两个值的值是连续数的时候,我们可以选择if语句。
当有3~10个格数和格值为非线性时,可以选择开关格语句。
当案例数量达到10以上时,我们可以选择查找表,结果只值一个值,而不是额外的Javascript语句。
以上是本文的全部内容,希望能对大家有所帮助。