Теоретически новый метод fill()
на типизированных массивах будет естественным кандидатом, так как он будет заполнять буфер внутри скомпилированной скоростью и, следовательно, производительность быстрее.
К сожалению, это не тот случай. This performance test показывают, что во время написания этого традиционный цикл while во много раз быстрее. Даже когда этот тест имеет небольшое наказание за цикл while.
Кроме того, fill()
является only supported in Firefox в данный момент.
Таким образом самый быстрый метод, использующий Uint16Array только, и с лучшей поддержкой кросс-платформенной делает:
var i = 0, a = new Uint16Array(16384);
while(i < 16384) a[i++] = 65;
UInt16/32 массивы всегда памяти выровнены, так что вы могли бы в некоторых случаях где длина их совпадает с границей по четыре байта, заполните вместо 32-битного массива значением 2x16 бит (рефакторинг по желанию):
var i = 0, len = 16384, a = new Uint16Array(len), c = 65;
if (len % 4) {
while(i < len) a[i++] = c; // fill Uint16Array as-is
}
else {
var u32 = new Uint32Array(a.buffer), // shares the same byte-buffer as a
len32 = u32.length,
v = (c << 16) | c; // make value span 2x16 bits
while(i < len32) u32[i++] = v; // fill at close to 2x speed
}
// use "a" here
Самый быстрый способ - t спецификация добавляет второй параметр к конструктору, который становится значением заполнения. В настоящее время значение заполнения всегда равно 0, но это расточительно – Esailija