Я хотел бы дополнить существующие ответы исследованием вопроса о том, как реализации ведут себя в отношении растущих массивов: если они реализуют их «обычным» способом, можно увидеть множество быстрых толчков с редкими, вкрапленными медленными толчками, в какой моментреализация копирует внутреннее представление массива из одного буфера в больший.
Вы можете очень хорошо увидеть этот эффект, это из Chrome:
16: 4ms
40: 8ms 2.5
76: 20ms 1.9
130: 31ms 1.7105263157894737
211: 14ms 1.623076923076923
332: 55ms 1.5734597156398105
514: 44ms 1.5481927710843373
787: 61ms 1.5311284046692606
1196: 138ms 1.5196950444726811
1810: 139ms 1.5133779264214047
2731: 299ms 1.5088397790055248
4112: 341ms 1.5056755767118273
6184: 681ms 1.5038910505836576
9292: 1324ms 1.5025873221216042
Даже если каждое нажатиепрофилированный вывод содержит только те, которые занимают время выше определенного порога.Для каждого теста я настраивал порог, чтобы исключить все толчки, которые, по-видимому, представляют быстрые толчки.
Таким образом, первое число представляет, какой элемент был вставлен (первая строка для 17-го элемента), втораяэто сколько времени заняло (для многих массивов эталонный тест выполняется параллельно), а последним значением является деление первого числа на число, указанное в предыдущей строке.
Все строки, у которых меньшедля Chrome исключено время выполнения более 2 мс.
Вы можете видеть, что Chrome увеличивает размер массива в степени 1,5 плюс некоторое смещение для учета небольших массивов.
Для Firefox это силадва:
126: 284ms
254: 65ms 2.015873015873016
510: 28ms 2.0078740157480315
1022: 58ms 2.003921568627451
2046: 89ms 2.0019569471624266
4094: 191ms 2.0009775171065494
8190: 364ms 2.0004885197850513
Мне пришлось немного повысить порог в Firefox, поэтому мы начинаем с # 126.
С IE мы получаем смесь:
256: 11ms 256
512: 26ms 2
1024: 77ms 2
1708: 113ms 1.66796875
2848: 154ms 1.6674473067915691
4748: 423ms 1.6671348314606742
7916: 944ms 1.6672283066554338
Сначала это степень двойки, а затем она переходит в степени пяти третей.
Таким образом, все распространенные реализации используют «нормальный» способ для массивов (вместо того, чтобы сходить с ума от веревки , например).
Вот код теста, а - скрипка , в которой он находится.
var arrayCount = 10000;
var dynamicArrays = [];
for(var j=0;j<arrayCount;j++)
dynamicArrays[j] = [];
var lastLongI = 1;
for(var i=0;i<10000;i++)
{
var before = Date.now();
for(var j=0;j<arrayCount;j++)
dynamicArrays[j][i] = i;
var span = Date.now() - before;
if (span > 10)
{
console.log(i + ": " + span + "ms" + " " + (i / lastLongI));
lastLongI = i;
}
}