typedArray 与 array 的读取与插入速度问题
- array在js中的实现是用哈希映射,其读取与插入效率都比较慢,于是出现了typedArray,开辟一整块连续的内存供开发者使用。
- 上述代码为测试结果,在node 8.10.1 上跑的结果第1,2,4 个代码块都正常,(1,2,4 分别为相同数据类型的读取,相同数据类型的插入,不同数据类型的插入)array比typedArray慢。但是第三个代码块(第三个代码块为不同类型的读取)就差距不是很多了,甚至typedArray比array还要慢一些。
- 下面为测试代码:
{
// 相同类型数组的读取
const arrLength = 50000000;
const arr = new Array(arrLength);
arr.fill(123);
let value_1;
console.time('array');
for(let i = 0; i < arr.length; i++) {
value_1 = arr[i];
}
console.timeEnd('array');
// arrayBuffer的读取
const arrBuffer = new ArrayBuffer(4 * arrLength);
const int32Arr = new Int32Array(arrBuffer);
int32Arr.fill(123);
let value_2;
console.time('int32Arr');
for (let i = 0 ; i < int32Arr.length; i++) {
value_2 = int32Arr[i];
}
console.timeEnd('int32Arr');
}
{
// 相同类型数组的插入
const arrLength = 50000000;
const arr = new Array(arrLength);
console.time('array');
for(let i = 0 ; i < arr.length; i++) {
arr[i] = i;
}
console.timeEnd('array');
// arrayBuffer的插入
const arrBuffer = new ArrayBuffer(4 * arrLength);
const int32Arr = new Int32Array(arrBuffer);
console.time('int32Arr');
for (let i= 0 ; i < int32Arr.length; i++) {
int32Arr[i] = i;
}
console.timeEnd('int32Arr');
}
{
// 不同数据类型的读取
const arrLength = 50000000;
const arr = new Array(arrLength);
arr.fill(123);
arr[0] = '234';
let value_1;
console.time('array');
for(let i = 0 ; i < arr.length; i++) {
value_1 = arr[i];
}
console.timeEnd('array');
// arrayBuffer的读取
const arrBuffer = new ArrayBuffer(4 * arrLength);
const int32Arr = new Int32Array(arrBuffer);
int32Arr.fill(123);
int32Arr[0] = '234';
let value_2;
console.time('int32Arr');
for (let i = 0; i < int32Arr.length; i++) {
value_2 = int32Arr[i];
}
console.timeEnd('int32Arr');
// 不同类型的情况下,arrayBuffer 的插入速度与array差不多
}
{
// 不同类型的插入
const arrLength = 50000000;
const arr = new Array(arrLength);
arr[0] = '234';
console.time('array');
for(let i = 1 ; i < arr.length; i++) {
arr[i] = i;
}
console.timeEnd('array');
// arrayBuffer的插入
const arrBuffer = new ArrayBuffer(4 * arrLength);
const int32Arr = new Int32Array(arrBuffer);
int32Arr[0] = '234';
console.time('int32Arr');
for (let i= 1 ; i < int32Arr.length; i++) {
int32Arr[i] = i;
}
console.timeEnd('int32Arr');
// 不同类型的情况下, arrayBuffer 的插入速度比array快,但是第一项数据丢失,(因为声明的是int类型的)存储的为0;
}
- 以下是运行结果贴图:
希望有了解的大神给我解答一下心中的疑惑… 不胜感激…
路漫漫…
2 回复
自己顶自己一下~ 希望来个大佬解答一下小生心中的困惑…
我再顶一下,来个大佬回复一下呗 …