[gist是我写的一个小型基准测试,比较了4个替代方法的平坦化数组的性能depth = 1在JS中(代码可以原样复制到Google控制台中)。如果我什么都没丢失,则本机Array.prototype.flat的性能迄今为止最差-比其他任何一种都慢30-50倍。
更新:我已经在jsperf上创建了一个基准。
应注意,此基准测试中的第四实施始终是性能最高的,通常其性能要好70倍。该代码已在节点v12和Chrome控制台中进行了多次测试。
此结果在较大的子集中最为突出-请参阅下面测试的最后2个数组。考虑到spec和V8 implementation似乎都跟在规范后面,因此该结果非常令人惊讶。我不了解C ++,也不熟悉V8兔子洞,但是在我看来,鉴于递归定义,一旦到达最终深度子数组,就不再对该子数组进行进一步的递归调用(标志当递减的深度达到0(即最终子级别)时,shouldFlatten为false,并将其添加到平坦化的结果中包括对每个子元素进行迭代循环以及对this method的简单调用。因此,我看不出a.flat应该在性能上遭受如此大的损失的充分理由。
[我认为也许未在原始公寓中预先分配结果大小的事实可能解释了这一差异。未预先分配的该基准测试的第二个实施方案表明,仅凭这一点并不能解释差异-它的性能仍然比本地公寓高5-10倍。这可能是什么原因?
测试的实现(顺序是相同的,存储在实现数组中-我写的两个都在代码段的末尾):