Javascript:为什么我的优化循环比更天真的循环更慢

时间:2017-09-03 22:58:26

标签: javascript arrays performance loops

如果您更喜欢格式化,请链接到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上。

1 个答案:

答案 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实际上并不是很慢。除非有一些奇怪的事情发生,否则你不会从拼写中获益。