数码资讯
Javascript中循环效率的深入探讨及相关优化
Underscore.js库 你一天写了多少个周期(一周) var i; For (I = 0; I < someArray.length; i++) { var = somearray {我}; DoSomeWorkOn(某物); } 当然,这并没有害处,但它是如此丑陋和陌生,以至于不需要抱怨,但
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
Underscore.js库
你一天写了多少个周期(一周)
var i;
For (I = 0; I < someArray.length; i++) {
var = somearray {我};
DoSomeWorkOn(某物);
}
当然,这并没有害处,但它是如此丑陋和陌生,以至于不需要抱怨,但是这种写作方式太平庸了。
var i,
J;
为(i = 0;我< someArray.length;i++){
var = somearray {我};
为(J = 0;J < something.stuff.length;j++){
DoSomeWorkOn(什么东西{,});
}
}
你正在扩展坏代码,然后在抛出一堆。
我两年没写一个循环了。
你在说什么呢
这是真的,一个冷笑话。事实上,没有一个不是(好吧,我确实写了一些),因为我不写循环,我的代码更容易理解。
你怎么做的
_。每个(somearray,功能(某物){
DoSomeWorkOn(某物);
})
或更好:
_。每个(somearray,dosomeworkon);
这就是underscorejs做了。干净、简单,容易阅读,短,没有中间变量,没有成堆的分号,简单大方。
下面是一些其他的例子。
var i,
结果= { };
为(i = 0;我< someArray.length;i++){
var = somearray {我};
我有这种痛,手疼。
如果(something.isawesome = true){
Result.push (someArray{i});
}
}
此外,一个典型的用例使用循环来浪费时间,即使这些网站提倡吸烟和素食主义,看到代码我感到气愤。
VaR结果= _。滤波器(somearray,功能(某物){)
返回something.isawesome =真;
})
像下划线中的过滤器名称一样,手工编写的3行代码可以给您一个新的数组(数组)。
或者要将这些数组转换成另一种形式
VaR结果= _。地图(somearray,功能(某物){)
返回trasformthething(某物);
})
以上三个例子在日常生活中已经足够了,但还不足以在桌子上加上下划线。
VaR总计= 0,
somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
我忘了提升那些索引了/不要;
为(i = 0;i < severalnumbers.length;i++){
一些severalnumbers {我} var =;
总计=数量* somepercentage;
}
下划线的版本
无功somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
GrandTotal;
总计= _。减少(severalnumbers,功能(runningtotal,大量){
返回runningtotal +(一些* somepercentage);
},0)
开始时可能有点奇怪。我看了文件,减少并知道它。因为我拒绝使用循环,所以这是我的第一选择。上面的东西只是底漆,和underscorejs图书馆有一大堆牛B的功能。
回收的挑战30天不使用。
30天内不要使用任何循环。如果你看到一堆讨厌和粗糙的东西,用它们或地图替换它们。
需要注意的是,下划线是函数编程的方式。可见和不可见的方式。
ourjs注*目前,现代浏览器都支持每个过滤器,地图和减少的方法,但强调图书馆可以与旧如以下的ES5本地方法写例兼容。
{ 3,4,5,3,3 }。foreach(功能(obj){)
console.log(obj);
});
{ }(1,2,3,4,5。过滤功能(obj){)
返回obj<3
});
{ 9,8,5,2,3,4,5 }。地图(功能(obj){)
返回obj + 2;
});
{ 12345 }。减少(功能(预,cur,编号,ARR){
console.log(IDX); / / 4周期:2-5
返回前+当前;
}); / 15
排序方法也很有用。
{ 9,8,5,2,3,4,5 }。排序(功能(obj1,obj2){
返回obj1 - obj2;
});
for和for循环
建议在效率远低于效率的循环(循环)。现在让我们来测试如何有效,循环,和每一个有效处理大型阵列在不同的浏览器。
在对循环缓存数组长度绝大多数开源软件,因为有些浏览器array.length每次都会重新计算数组的长度的共同观点,通常用一个临时变量来存储数组的长度,如:
对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}
我们还将测试缓存和非缓存之间的性能差异。
同时,将求和相加加到每个测试循环中,以表明它不是空循环。
对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}
我们还将测试缓存和非缓存之间的性能差异。
同时,将求和相加加到每个测试循环中,以表明它不是空循环。
测试代码如下所示。单击run查看
HTML代码
Javascript代码
函数(){
准备200万个数据的大数组
无功testarray = { }
对象= { }。
IDX。
len = 2000000
TMP = 0
结果= $(美元#结果)
浏览器= $(美元#浏览器)
;
browser.html美元(导航。用户代理);
results.html美元(' ');
对于(var i = 0;i < i;i + +){
var = Math.random(数); / /如果我们想加快操作速度可用于:(10)* 0整数| Math.random
TestArray.push(数);
TestObject {我} =数量;
}
results.append美元(需要测试的测试代码,结果时间毫秒);
函数测试
VaR测试=功能(testfunc){
VaR的开始时间
结束时间
结果
;
StartTime =新的日期();
TMP=0;
TestFunc();
结果=新的日期();
测试用例(测试用例)的运行时间计算
结果=结束时间-开始时间;
results.append美元({ 0 } { 1 } { 2 }。格式(testfunc ToString)、TMP |(0,结果));
};
测试(函数(){())
用于测试效率
对于(IDX在testarray){
TMP = testarray {编号}; / /测试后,结果是字符串类型,可以减慢的原因之一
}
});
测试(函数(){())
循环效率试验
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = testarray {编号};
}
});
测试(函数(){())
/ /效率测试foreach
testarray.foreach(功能(数据){)
数据;
});
});
测试(函数(){())
测试不缓存效率 / / array.length
对于(IDX = 0;IDX < testarray.length;idx + +){
TMP = testArray{idx};
}
});
测试(函数(){())
测试{ }(对象)保存时间的健康值,用于效率
对于(IDX在对象){
TMP = TestObject {编号};
}
});
测试(函数(){())
如何从测试中检测对象(其中健康密钥值的值已知)
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = TestObject {编号};
}
});
}
运行{等待片刻}
测试结果
测试结果可能会因计算而有所不同,这是对Firefox、Chrome和IE三测试结果在我的机器上拼接结果的总结。
以下是几点意见
因为在速度上比循环慢得多,至少在Chrome中慢20倍。
FF优化foreach(ES5),一位比环,但铬/ IEN性能差
FF /缓存array.length比慢一点当你直接使用它。除了IE浏览器的最新版本的缓存,性能提升非常小(这是很意外)
在某些情况下,FF的js引擎的性能似乎优于V8引擎。
你一天写了多少个周期(一周)
var i;
For (I = 0; I < someArray.length; i++) {
var = somearray {我};
DoSomeWorkOn(某物);
}
当然,这并没有害处,但它是如此丑陋和陌生,以至于不需要抱怨,但是这种写作方式太平庸了。
var i,
J;
为(i = 0;我< someArray.length;i++){
var = somearray {我};
为(J = 0;J < something.stuff.length;j++){
DoSomeWorkOn(什么东西{,});
}
}
你正在扩展坏代码,然后在抛出一堆。
我两年没写一个循环了。
你在说什么呢
这是真的,一个冷笑话。事实上,没有一个不是(好吧,我确实写了一些),因为我不写循环,我的代码更容易理解。
你怎么做的
_。每个(somearray,功能(某物){
DoSomeWorkOn(某物);
})
或更好:
_。每个(somearray,dosomeworkon);
这就是underscorejs做了。干净、简单,容易阅读,短,没有中间变量,没有成堆的分号,简单大方。
下面是一些其他的例子。
var i,
结果= { };
为(i = 0;我< someArray.length;i++){
var = somearray {我};
我有这种痛,手疼。
如果(something.isawesome = true){
Result.push (someArray{i});
}
}
此外,一个典型的用例使用循环来浪费时间,即使这些网站提倡吸烟和素食主义,看到代码我感到气愤。
VaR结果= _。滤波器(somearray,功能(某物){)
返回something.isawesome =真;
})
像下划线中的过滤器名称一样,手工编写的3行代码可以给您一个新的数组(数组)。
或者要将这些数组转换成另一种形式
VaR结果= _。地图(somearray,功能(某物){)
返回trasformthething(某物);
})
以上三个例子在日常生活中已经足够了,但还不足以在桌子上加上下划线。
VaR总计= 0,
somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
我忘了提升那些索引了/不要;
为(i = 0;i < severalnumbers.length;i++){
一些severalnumbers {我} var =;
总计=数量* somepercentage;
}
下划线的版本
无功somepercentage = 1.07,
severalnumbers = { 33, 54, 42 },
GrandTotal;
总计= _。减少(severalnumbers,功能(runningtotal,大量){
返回runningtotal +(一些* somepercentage);
},0)
开始时可能有点奇怪。我看了文件,减少并知道它。因为我拒绝使用循环,所以这是我的第一选择。上面的东西只是底漆,和underscorejs图书馆有一大堆牛B的功能。
回收的挑战30天不使用。
30天内不要使用任何循环。如果你看到一堆讨厌和粗糙的东西,用它们或地图替换它们。
需要注意的是,下划线是函数编程的方式。可见和不可见的方式。
ourjs注*目前,现代浏览器都支持每个过滤器,地图和减少的方法,但强调图书馆可以与旧如以下的ES5本地方法写例兼容。
{ 3,4,5,3,3 }。foreach(功能(obj){)
console.log(obj);
});
{ }(1,2,3,4,5。过滤功能(obj){)
返回obj<3
});
{ 9,8,5,2,3,4,5 }。地图(功能(obj){)
返回obj + 2;
});
{ 12345 }。减少(功能(预,cur,编号,ARR){
console.log(IDX); / / 4周期:2-5
返回前+当前;
}); / 15
排序方法也很有用。
{ 9,8,5,2,3,4,5 }。排序(功能(obj1,obj2){
返回obj1 - obj2;
});
for和for循环
建议在效率远低于效率的循环(循环)。现在让我们来测试如何有效,循环,和每一个有效处理大型阵列在不同的浏览器。
在对循环缓存数组长度绝大多数开源软件,因为有些浏览器array.length每次都会重新计算数组的长度的共同观点,通常用一个临时变量来存储数组的长度,如:
对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}
我们还将测试缓存和非缓存之间的性能差异。
同时,将求和相加加到每个测试循环中,以表明它不是空循环。
对于(var idx = 0,len = testarray.length;IDX < len;idx + +){
意为做某事。
}
我们还将测试缓存和非缓存之间的性能差异。
同时,将求和相加加到每个测试循环中,以表明它不是空循环。
测试代码如下所示。单击run查看
HTML代码
Javascript代码
函数(){
准备200万个数据的大数组
无功testarray = { }
对象= { }。
IDX。
len = 2000000
TMP = 0
结果= $(美元#结果)
浏览器= $(美元#浏览器)
;
browser.html美元(导航。用户代理);
results.html美元(' ');
对于(var i = 0;i < i;i + +){
var = Math.random(数); / /如果我们想加快操作速度可用于:(10)* 0整数| Math.random
TestArray.push(数);
TestObject {我} =数量;
}
results.append美元(需要测试的测试代码,结果时间毫秒);
函数测试
VaR测试=功能(testfunc){
VaR的开始时间
结束时间
结果
;
StartTime =新的日期();
TMP=0;
TestFunc();
结果=新的日期();
测试用例(测试用例)的运行时间计算
结果=结束时间-开始时间;
results.append美元({ 0 } { 1 } { 2 }。格式(testfunc ToString)、TMP |(0,结果));
};
测试(函数(){())
用于测试效率
对于(IDX在testarray){
TMP = testarray {编号}; / /测试后,结果是字符串类型,可以减慢的原因之一
}
});
测试(函数(){())
循环效率试验
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = testarray {编号};
}
});
测试(函数(){())
/ /效率测试foreach
testarray.foreach(功能(数据){)
数据;
});
});
测试(函数(){())
测试不缓存效率 / / array.length
对于(IDX = 0;IDX < testarray.length;idx + +){
TMP = testArray{idx};
}
});
测试(函数(){())
测试{ }(对象)保存时间的健康值,用于效率
对于(IDX在对象){
TMP = TestObject {编号};
}
});
测试(函数(){())
如何从测试中检测对象(其中健康密钥值的值已知)
对于(IDX = 0,len = testarray.length;IDX < len;idx + +){
TMP = TestObject {编号};
}
});
}
运行{等待片刻}
测试结果
测试结果可能会因计算而有所不同,这是对Firefox、Chrome和IE三测试结果在我的机器上拼接结果的总结。
以下是几点意见
因为在速度上比循环慢得多,至少在Chrome中慢20倍。
FF优化foreach(ES5),一位比环,但铬/ IEN性能差
FF /缓存array.length比慢一点当你直接使用它。除了IE浏览器的最新版本的缓存,性能提升非常小(这是很意外)
在某些情况下,FF的js引擎的性能似乎优于V8引擎。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。