为什么阵列文字和Bufferarray之间的性能差距如此之大



我试图理解JS中的ArrayBuffer,因为它是线程和工人之间的可转移类型之一。

我发现巨大的性能差距是可变创建的,我无法通过互联网找到答案。

我尝试了几个基准测试和阵列英列式的声明速度要比Typedarrays更快。我在节点11,Chrome和Firefox中尝试了结果,结果连贯。

var LIMIT = 10000;
console.time("Array insertion time");
for (var i = 0; i < LIMIT; i++) {
    var arr = new Array();
}
console.timeEnd("Array insertion time");

console.time("ArrayBuffer insertion time");
for (var i = 0; i < LIMIT; i++) {
  var buffer = new ArrayBuffer(LIMIT * 4);
  var arr = new Int32Array(buffer);
}
console.timeEnd("ArrayBuffer insertion time");

我收到疯狂的结果:
数组插入时间:1.283ms
ArrayBuffer插入时间:53.979ms

我认为,JS引擎声明打字机比刻板标准更快。我以为ArrayBuffer是将内存分配给程序的非常优化的呼吁。

您根本没有做同样的事情...

当您声明一个ArrayBuffer时,浏览器会要求一个静态内存插槽,此arraybuffer的大小。
另一方面,数组没有静态内存插槽,它将重新分配,而长度将更新。

因此,如果您想执行公平测试,那么您需要在这些数组中分配一些数据,因为目前,它们只是针对引擎所关注的空物,即它们的脚印非常低,并且很快生成。

var LIMIT = 5000; // I have to lower the LIMIT because Array is so slow
console.time("Array insertion time");
for (var i = 0; i < LIMIT; i++) {
  // to be fair, they should hold the same data
  var arr = new Array(LIMIT * 4).fill(0);
}
console.timeEnd("Array insertion time");
console.time("ArrayBuffer insertion time");
for (var i = 0; i < LIMIT; i++) {
  var buffer = new ArrayBuffer(LIMIT * 4);
  var arr = new Int32Array(buffer);
}
console.timeEnd("ArrayBuffer insertion time");

原始类型通常总是会更快。它们的使用频率如此之大,以至于在发动机中获得了最大的注意。打字阵列很可能具有更多的开销,因为它们在插入等操作上执行类型检查。那不是免费的。

此外,您的第二个示例正在做更多的工作来声明缓冲区,然后将其转换为键入数组。您还在执行非常小的操作,其中旨在存储更大的长缓冲区,例如二进制音频或图像。

最新更新