What's the time complexity of JavaScript spread syntax in arrays?
Asked Answered
W

1

15

I was wondering what is the time complexity of using spread with an array in JavaScript. Is it linear O(n) or constant O(1)?

Example of syntax below:

let lar = Math.max(...nums)
Windowsill answered 15/7, 2019 at 1:30 Comment(5)
I don't have any evidence, but it would be quite odd if it wasn't O(n). It has to iterate over every element of the array.Howdy
There is no spread operator, there is spread syntax. ;-)Superscribe
@Superscribe ya sorry about that. Will edit the question :)Windowsill
@Howdy ya at-least it's better to see a clearer picture that's why I asked haha.Windowsill
I think it will depend on the alternative you want to compare to and the implementation it's running in, e.g. in the OP, vs Math.max.apply(null,nums) and maybe in the case of a host object vs Array.from(document.getElementsByTagName('p')) or similar.Superscribe
S
38

Spread calls the [Symbol.iterator] property on the object in question. For arrays, this will iterate through every item in the array, calling the array iterator's .next() until the iterator is exhausted, resulting in complexity of O(N).

For the exact same reason, for..of (which also calls [Symbol.iterator]) loops are also O(N):

const arr = [1, 2, 3];
for (const item of arr) {
  console.log(item);
}

For a live example, see how the following snippet takes some time to execute:

const arr = new Array(3e7).fill(null);
const t0 = performance.now();
const arr2 = [...arr];
console.log(performance.now() - t0);

(if the operation was O(1), it'd be near instantaneous, but it isn't)

Argument spread is different from array spread, but it uses the same operation (iterates through the iterable until it's exhausted), and so has the same complexity.

For function calls:

myFunction(...iterableObj);
Strickman answered 15/7, 2019 at 1:32 Comment(1)
Just a note that simplistic performance tests like the above are likely heavily influenced by how different implementations do or don't optimise code. Making a change to the operations being performed can have a significant impact on relative performance that far exceeds any differences in ..., for..in, for..of, etc. :-)Superscribe

© 2022 - 2024 — McMap. All rights reserved.