为什么 TypedArrays 不比普通数组快?我想使用 CLZ 的预计算值(计算前导零函数)。而且我不希望他们解释为通常的对象?
http://jsperf.com/array-access-speed-2⁄2
准备代码:
Benchmark.prototype.setup = function() {
var buffer = new ArrayBuffer(0x10000);
var Uint32 = new Uint32Array(buffer);
var arr = [];
for(var i = 0; i < 0x10000; ++i) {
Uint32[i] = (Math.random() * 0x100000000) | 0;
arr[i] = Uint32[i];
}
var sum = 0;
};
测试 1:
sum = arr[(Math.random() * 0x10000) | 0];
测试 2:
sum = Uint32[(Math.random() * 0x10000) | 0];
PS:可能是我的性能测试无效,请随时纠正我。
原文由 Sukhanov Niсkolay 发布,翻译遵循 CC BY-SA 4.0 许可协议
与以下内容不同:
不是因为新的
ArrayBuffer
(你总是得到一个数组缓冲区:见Uint32.buffer
在这两种情况下)而是因为长度参数:与ArrayBuffer
-b-5553c每个元素一个字节,使用Uint32Array
每个元素有 4 个字节。因此,在第一种情况下(在您的代码中)
Uint32.length = 0x1000/4
并且您的循环 4 次中有 3 次越界。但遗憾的是,您永远不会出错,只会出现糟糕的表现。使用
new ArrayBuffer
,你必须像这样声明 Uint32 :请参阅 带有 (0x10000) 的 jsperf 和 带有 (0x10000 * 4) 的 jsperf 。