![](/img/trans.png)
[英]Why most JavaScript native functions are slower than their naive implementations?
[英]Javascript: Why is my optimized loop slower than the more naive one
如果您喜欢jsperf的格式, 请链接到jsperf: https ://jsperf.com/test-array-vs-loop-vs-loop-optimized
我正在尝试使用旧的jsperf循环vs过滤器,并且尝试通过正确分配大小(如果大小正确)并避免重新计算项目长度来优化循环。 问题是它在我的Chrome 60上没有更快地运行。
这是代码:
var items = [];
var names = ['george', 'nick', 'jack', 'herodotus', 'joanne'];
for (var i = 0; i < 2000; i++) {
var obj = {
name: names[i % 5] + '-' + i,
age: i % 10 + 15
};
items.push(obj);
}
function filter_callback(item) {
return (item.age == '18');
}
function test_filter() {
var aged_18_filter = items.filter(filter_callback);
}
function test_loop() {
var aged_18_loop = [];
for (var i = 0; i < items.length; i++) {
if (items[i].age == '18') aged_18_loop.push(items[i]);
}
}
function test_loop_optimized() {
var length=items.length
var aged_18_loop = new Array(length);
for (var i = 0; i < length; i++) {
if (items[i].age == '18') aged_18_loop[i]=items[i];
}
}
编辑:正常循环的结果约为39281 ops / sec,“优化”循环的结果约为37389 ops / sec。 在i7 3610QM上。
我尝试通过正确分配数组大小来优化循环
但是你失败了。 过滤结果通常与输入的大小不同。 通过不附加末尾的数组(使用push
)并始终分配给索引i
,您甚至可以创建稀疏数组。 (鉴于您的样本很小,它至少没有产生很大的影响)。
正确的方法可能是
function test_loop_optimized() {
var length = items.length;
// let's guess that the result will have about a fifth of the size
var result = new Array(Math.round(length / 5));
var i = 0;
var j = 0;
while (i < length) {
var item = items[i++];
if (item.age == '18')
result[j++] = item;
}
result.length = j; // just in case we guessed too high
return result;
}
…并避免重新计算商品长度
这是JS引擎确实想单独应用的简单优化。 实际上,访问.length
并不是真的很慢。 除非发生奇怪的事情,否则您将无法从拼写中受益。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.