javascript - JavaScript 数组扩展语法的运行时复杂度是多少?

标签 javascript algorithm performance ecmascript-6

假设我想使用数组扩展语法复制现有数组,如下所示:

const a = [1, 2, 3, ..., n];
const b = [...a]

const b = [...a] 的运行时复杂度是多少?我似乎找不到任何相关信息。

最佳答案

理论上,它需要一点前期成本,然后是线性的(假设是标准数组迭代器,而不是自定义的东西),因为理论上它是一个消耗数组中迭代器的循环,如下所示:

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
for (const element of a) {
    b[b.length] = element;
}
console.log(b);

这实际上是:

const a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const b = [];
{
    const it = a[Symbol.iterator]();
    let result;
    while (!(result = it.next()).done) {
        const element = result.value;
        b[b.length] = element;
    }
}
console.log(b);

(在特定的 [...a] 情况下,即使进行最小程度的优化,JavaScript 引擎也可能能够消除迭代器开销并使其简单地线性化,就像 a .slice() 会。)

即使由 JavaScript 引擎优化(例如,如果它位于代码中的热点),也不清楚它如何能比线性做得更好,因为即使是 memcopy 操作也是线性的。

我说“假设标准数组迭代器”因为并非所有迭代器都一定是线性的。标准数组迭代器是线性的,但这并不意味着所有迭代器都是线性的。

关于javascript - JavaScript 数组扩展语法的运行时复杂度是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66292173/

相关文章:

javascript - 来自文本字段的值不返回任何内容

algorithm - 拓扑排序为什么要找最短路径O(V+E)

Java代码优化会导致数值不正确和错误

java - 如何在java中实现轮胎 map ?

mysql - 保证快速响应,预计 1 秒行数

c# - C# 中非常大的数组(内存方面)的推荐类型

javascript - jQuery post 到另一个 javascript 函数中

javascript - Jinja、Flask 和 CanvasJS 不显示图表

javascript - .prototype 和 [[prototype]]。为什么 .prototype 是一个空对象?

javascript - 在 JavaScript 中使用父/子列表从平面列表生成嵌套列表