与JavaScript中的数组和对象(尤其是Google V8)相关的性能对于文档来说非常有趣.我在互联网上找不到关于这个主题的综合文章.
我知道一些对象使用类作为它的底层数据结构.如果有很多属性,它有时被视为哈希表?
我也理解,数组有时被视为C++数组(即快速随机索引,慢速删除和调整大小).而且,其他时候,它们更像对象(快速索引,快速插入/删除,更多内存).并且,有时它们可能存储为链接列表(即慢速随机索引,在开头/结尾快速删除/插入)
JavaScript中的数组/对象检索和操作的精确性能是什么?(专门针对Google V8)
更具体地说,它对性能的影响如下:
任何文章或链接的更多细节也将不胜感激.:)
编辑:我真的很想知道JavaScript数组和对象是如何工作的.此外,在什么情况下 V8引擎"知道""转换"到另一个数据结构?
例如,假设我用...创建一个数组
var arr = [];
arr[10000000] = 20;
arr.push(21);
Run Code Online (Sandbox Code Playgroud)
这里到底发生了什么?
或者......这个怎么样...... ???
var arr = [];
//Add lots of items
for(var i = 0; i < 1000000; i++)
arr[i] = Math.random();
//Now I use it like a queue...
for(var i = 0; i < arr.length; i++)
{
var item = arr[i].shift();
//Do something with item...
} …Run Code Online (Sandbox Code Playgroud) javascript之间的区别Array,Object并不是很大.实际上它似乎Array主要添加了length字段,因此您可以将Arrays和Objects用作数字数组:
var ar = new Array();
ar[0] = "foo";
ar["bar"] = "foo";
var ob = new Object();
ob[0] = "foo";
ob["bar"] = "foo";
assert(ar[0] == ob[0] == ar["0"] == ob["0"] == ar.bar == ob.bar); // Should be true.
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,在流行的JavaScript引擎(V8,JavaScriptCore,SpiderMonkey等)中,这是如何处理的?显然,我们不希望我们的数组实际存储为具有键值的哈希映射!我们怎样才能合理地确定我们的数据是否存储为实际数组?
据我所知,引擎可以采取一些方法:
Array实现方式与Object- 使用字符串键的关联数组完全相同.Array是一个特殊情况,一个std::vector支持数字键的类似数组,以及一些密度启发式,以防止疯狂的内存使用ar[100000000] = 0;Array是相同的Object,并且所有对象都获得启发式,以查看使用数组是否更有意义.如果有一个合适的阵列类型(咳嗽 WebGL类型阵列咳嗽),这真的会更简单.