如果您更喜欢格式化,请链接到jsperf:https://jsperf.com/test-array-vs-loop-vs-loop-optimized
我正在尝试旧的jsperf循环vs过滤器,我试图通过预先分配数组来优化循环,如果正确的大小和避免项目长度重新计算。问题是我的Chrome 60运行速度不快。
以下是代码:
>>> find_library("/usr/local/opus")
>>> find_library("/usr/local/lib/opus")
>>> find_library("/usr/local/lib/libopus")
>>> '/usr/local/lib/libopus.dylib'
编辑:正常循环的结果大约为39,281次/秒,“优化”循环的结果为37,389次/秒。在i7 3610QM上。
答案 0 :(得分:4)
我尝试通过预先分配数组来优化循环,如果正确的大小
但你失败了。过滤结果通常与输入的大小不同。通过不在末尾附加数组(使用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
实际上并不是很慢。除非有一些奇怪的事情发生,否则你不会从拼写中获益。