我试图了解js中的ArrayBuffer,因为它是线程和工作程序之间可传递的类型之一。
我发现在变量创建方面存在巨大的性能差距,并且无法在Internet上找到答案。
我尝试了几种基准测试,并且声明数组总是比TypedArrays快得多。我在节点11中尝试了chrome和firefox,结果是一致的。
num_streams
我收到了疯狂的结果:
数组插入时间: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");
ArrayBuffer插入时间:1.283ms
我认为JS引擎声明TypedArray比乱扔垃圾更快。我以为ArrayBuffer是一个非常优化的调用,用于为程序分配内存。
答案 0 :(得分:3)
您根本不做同一件事...
在声明ArrayBuffer时,浏览器将要求一个静态内存插槽,此ArrayBuffer的大小。
另一方面,数组没有静态内存插槽,它将被重新分配,而其长度将被更新。
因此,如果您想执行公平的测试,则需要在这些Array中分配一些数据,因为当前,对于引擎而言,它们只是空对象,即它们的足迹很小,并且生成速度非常快。
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");
答案 1 :(得分:-2)
原始类型通常总是会更快。它们的使用频率很高,因此在引擎优化方面引起了最多的关注。类型数组很可能会产生更多开销,因为它们正在对诸如插入之类的操作执行类型检查。那不是免费的。
此外,您的第二个示例还要做更多工作,即声明缓冲区,然后将其转换为类型化数组。您还将执行非常小的操作,其中ArrayBuffer用于存储更大的长缓冲区,例如二进制音频或图像。