gpt4 book ai didi

javascript - 在 V8 中使用数组(性能问题)

转载 作者:行者123 更新时间:2023-12-03 01:09:33 31 4
gpt4 key购买 nike

我尝试了下一个代码(它在 Google Chrome 和 Nodejs 中显示了类似的结果):

var t = new Array(200000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27839.499ms
undefined

我还运行了接下来的测试:

var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 449.948ms
undefined
var t = []; console.time('wtf'); for (var i = 0; i < 400000; ++i) {t.push(undefined);} console.timeEnd('wtf');
wtf: 406.710ms
undefined

但是在 Firefox 中,第一个变体看起来一切都很好:

>>> var t = new Array(200000); console.time('wtf'); ...{t.push(Math.random());} console.timeEnd('wtf');
wtf: 602ms

V8 中会发生什么?

UPD* 神奇地降低性能 *

var t = new Array(99999); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 220.936ms
undefined
var t = new Array(100000); t[99999] = 1; console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1731.641ms
undefined
var t = new Array(100001); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1703.336ms
undefined
var t = new Array(180000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 1725.107ms
undefined
var t = new Array(181000); console.time('wtf'); for (var i = 0; i < 200000; ++i) {t.push(Math.random());} console.timeEnd('wtf');
wtf: 27587.669ms
undefined

最佳答案

如果您预分配,请勿使用.push,因为您将创建一个由哈希表支持的稀疏数组。 You can preallocate sparse arrays up to 99999 elements它将由一个 C 数组支持,之后它是一个哈希表。

对于第二个数组,您将从 0 开始以连续的方式添加元素,因此它将由真正的 C 数组而不是哈希表支持。

粗略地说:

如果你的数组索引很好地从 0 到 Length-1,没有空洞,那么它可以用快速 C 数组表示。如果你有数组中存在漏洞,那么它将由一个慢得多的哈希表表示。异常(exception)情况是,如果您预分配一个数组大小< 100000,那么你可以在数组中有洞并且仍然得到 C 数组的支持:

var a = new Array(N); 

//If N < 100000, this will not make the array a hashtable:
a[50000] = "sparse";

var b = [] //Or new Array(N), with N >= 100000
//B will be backed by hash table
b[50000] = "Sparse";
//b.push("Sparse"), roughly same as above if you used new Array with N > 0

关于javascript - 在 V8 中使用数组(性能问题),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16961838/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com