js native array.flat是否慢于depth = 1?

问题描述 投票:0回答:1

[gist是我写的一个小型基准测试,比较了4个替代方法的平坦化数组的性能depth = 1在JS中(代码可以原样复制到Google控制台中)。如果我什么都没丢失,则本机Array.prototype.flat的性能迄今为止最差-比其他任何一种都慢30-50倍。

更新:我已经在jsperf上创建了一个基准。

应注意,此基准测试中的第四实施始终是性能最高的,通常其性能要好70倍。该代码已在节点v12和Chrome控制台中进行了多次测试。

此结果在较大的子集中最为突出-请参阅下面测试的最后2个数组。考虑到specV8 implementation似乎都跟在规范后面,因此该结果非常令人惊讶。我不了解C ++,也不熟悉V8兔子洞,但是在我看来,鉴于递归定义,一旦到达最终深度子数组,就不再对该子数组进行进一步的递归调用(标志当递减的深度达到0(即最终子级别)时,shouldFlatten为false,并将其添加到平坦化的结果中包括对每个子元素进行迭代循环以及对this method的简单调用。因此,我看不出a.flat应该在性能上遭受如此大的损失的充分理由。

[我认为也许未在原始公寓中预先分配结果大小的事实可能解释了这一差异。未预先分配的该基准测试的第二个实施方案表明,仅凭这一点并不能解释差异-它的性能仍然比本地公寓高5-10倍。这可能是什么原因?

测试的实现(顺序是相同的,存储在实现数组中-我写的两个都在代码段的末尾):

    [我自己的展平实现,其中包括预先分配最终展平的长度(从而避免所有重新分配的大小)。对不起命令式代码,我想获得最大的性能。
  1. 最简单的天真实现,遍历每个子数组并推入最终数组。 (因此冒着重新分配大小的风险)。
  2. Array.prototype.flat(native flat)
  3. [] .concat(... arr)(=扩展数组,然后将结果串联在一起。这是一种实现depth = 1展平的流行方法)。
  • 经测试的数组(顺序相同,存储在基准对象中):

      1000个子数组,每个子数组包含10个元素。 (总共10个)
  • 10个子数组,每个子数组具有1000个元素。 (总共10个)
  • 10000个子数组,每个子数组具有1000个元素。 (总计1000万个)[] 100个子数组,每个子数组100000个元素。 (总计1,000万)
  • [要点是我写的一个小型基准测试,比较了在JS中平整depth = 1数组的4个替代方法的性能(可以将代码按原样复制到Google控制台中)。如果我不缺少...
  • javascript performance benchmarking v8 flatten
    1个回答
    4
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.