2015-03-22 4 views
1
var a = Uint16Array(16384), n = a.length, c = 65; 
for (var i = 0; i < n; i++) a[i] = c; 

Есть ли способ сделать это быстрее? Это типизированный массив из двух байтов на ячейку.Самый быстрый способ заполнить Uint16Array одним значением

Я помню memset() от C или fillchar от Pascal.

+0

Самый быстрый способ - t спецификация добавляет второй параметр к конструктору, который становится значением заполнения. В настоящее время значение заполнения всегда равно 0, но это расточительно – Esailija

ответ

3

Теоретически новый метод fill() на типизированных массивах будет естественным кандидатом, так как он будет заполнять буфер внутри скомпилированной скоростью и, следовательно, производительность быстрее.

К сожалению, это не тот случай. This performance test показывают, что во время написания этого традиционный цикл while во много раз быстрее. Даже когда этот тест имеет небольшое наказание за цикл while.

Кроме того, fill() является only supported in Firefox в данный момент.

snap

Таким образом самый быстрый метод, использующий 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 
+1

(и, конечно же, вы всегда можете заполнить uint32, где они совпадают, а в случаях они не просто выполняют uint16 для последних двух байтов). – K3N

0

Я бы рекомендовал использовать fill method из TypedArrays:

var a = Uint16Array(16384).fill(65); 

Вы должны бенчмарка ли это на самом деле быстрее, чем цикл, но она должна быть оптимизирована с помощью двигателя (возможно, они не имеют однако это реализовано).

Смежные вопросы