【问题标题】:Javascript perf to clean an arrayJavascript perf 清理数组
【发布时间】:2014-03-29 15:23:06
【问题描述】:

我只是看了一眼:

http://jsperf.com/array-destroy/32

第一个没看懂:

arr.length = 0;

可以慢于:

while (arr.length > 0) {
  arr.shift();
}

有人可以链接/解释原因吗?

【问题讨论】:

  • 谢谢!但是链接没有解释为什么它更快,或者我错过了什么?
  • 设置length 时会发生很多事情:es5.github.io/#x15.4.5.1,与.shift 相比:es5.github.io/#x15.4.4.9。仍在尝试找出每个算法的哪一部分在执行.length = 0 时被触发。
  • 嗯。还是不知道。看起来.shift 也触发了分配给.length 会触发的相同代码。
  • 它必须是垃圾收集机制,并且可能是解释器中使用的其他一些迭代条件检查。哪种方法执行得最好取决于 Javascript 引擎。在 Firefox 中,pop 方法比 shift 方法快 1.8%+。

标签: javascript arrays performance


【解决方案1】:

在测试设置中,创建了一个大数组。一旦测试开始,数组就会被清空,测试会重复进行。但是,每次第一次运行测试后,数组已经为空。为了准确地执行此测试,您必须每次都创建一个新数组。 试试这个:

http://jsperf.com/array-destroy/67

我修改了测试,每次都返回一个新数组。结果与预期一致。 splicelength 是最快的,因为它们会立即修改数组的长度而无需循环。

【讨论】:

  • 啊,我知道这里出了点问题。或者我错过了一些关于 javascript 数组的重要信息,谢谢!循环如何比简单的分配更快,除了在后台触发隐藏的东西的魔法我不明白这怎么可能。
【解决方案2】:

当使用pop() 时,数组中的最后一个元素被删除,仅此而已。 当使用shift() 时,第一个数组被删除,所有其余元素都被重新索引。数组越大,所需的时间就越长。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    • 2011-04-04
    • 2021-04-17
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多