使用单个值填充Uint16Array的最快方法

时间:2015-03-22 22:48:08

标签: javascript v8 typed-arrays

var a = Uint16Array(16384), n = a.length, c = 65;
for (var i = 0; i < n; i++) a[i] = c;

有没有办法更快地完成这项工作?这是每个单元格两个字节的类型化数组。

我记得来自C的memset()或来自Pascal的fillchar

2 个答案:

答案 0 :(得分:2)

理论上,类型化数组上的新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 :(得分:0)

我建议使用fill method TypedArrays:

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

你必须确定它是否实际上比循环更快,但它应该由引擎优化(尽管它们尚未实现)。