的JavaScript。两个阵列,大小相同,性能完全不同。为什么?

时间:2017-12-02 08:40:31

标签: javascript arrays performance

方法1

const { performance } = require('perf_hooks');
performance.mark('A');

for (var i = 0; i < 100; i++) {
  let x = new Array(1000);
  x.fill(new Array(1000).fill(0));
}

performance.mark('B');
performance.measure('A to B', 'A', 'B');
const measure = performance.getEntriesByName('A to B')[0];
console.log(measure.duration); // 5.5ms

方法2

performance.mark('C');

for (var i = 0; i < 100; i++) {
  let x = new Array(1000000);
  x.fill(0);
}

performance.mark('D');
performance.measure('C to D', 'C', 'D');
const measure2 = performance.getEntriesByName('C to D')[0];
console.log(measure2.duration); // 594ms

方法1是一个百万大小的数组,但均匀分布。要检索/存储,我会通过一些基本哈希来将其视为内容可寻址存储,以放置和检索元素。 5.5ms 为亿元素

方法2是一个百万大小的数组。初始化要高出两个数量级! 594ms 为亿元素。

有人可以帮助解释这里发生的事情并阐明理想的阵列尺寸/阵列配置吗?我想这与v8 / C ++领域的某种优化有关。

1 个答案:

答案 0 :(得分:2)

x

这是两个数组。 x是一个数组,其中包含对一个数组的1000个引用,其中包含1000个零。

元素总数:2000(let x = new Array(1000000); x.fill(0); 的长度为1000 +它所引用的数组的长度为1000)。

TypeError: undefined is not an object (evaluating 'this.props.data.map')

这是一个有百万个零的数组。

元素总数:1000000。