var a = Uint16Array(16384), n = a.length, c = 65;
for (var i = 0; i < n; i++) a[i] = c;
有没有办法更快地完成这项工作?这是每个单元格两个字节的类型化数组。
我记得来自C的memset()
或来自Pascal的fillchar
。
答案 0 :(得分:2)
理论上,类型化数组上的新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
答案 1 :(得分:0)
我建议使用fill
method TypedArrays:
var a = Uint16Array(16384).fill(65);
你必须确定它是否实际上比循环更快,但它应该由引擎优化(尽管它们尚未实现)。