与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数组中,以及将数组中的任何元素更改为其他类型.解释器如何跟踪任何元素在物理内存中的位置.如果我将元素更改为更大的数据类型,如何防止覆盖下一个元素中的数据.
我假设数组只存储对实际对象的引用,并且当放置在数组中时,基元被包裹在场景后面.
假设是这种情况,如果我对原始变量有不同的句柄并更改存储在数组中的值是同步性保持?
我知道我可能已经回答了我自己的问题,但我不确定,我找不到有关此事的任何信息.
我是Javascript的新手,并注意到你不需要指定一个数组的大小,并经常看到人们一次动态创建数组元素.这在其他语言中将是一个巨大的性能问题,因为随着它的大小增加,您将不断需要为该阵列重新分配内存.
这不是JavaScript中的问题吗?如果是这样,那么是否有可用的列表结构?
我知道,因为javascript允许对象的数字键,因此技术上可能存在类似数组的对象,但为什么它们变得普遍?
也许这个想法是这些类似数组的对象不仅具有数字键,例如arguments具有callee属性,因此它们不能是适当的数组来容纳这些属性.
但是在javascript中,将数组视为对象并使用非数字键是完全有效的:
var myArguments = [];
myArguments[0] = 0;
myArguments['callee'] = function(){console.log('callee')};
Run Code Online (Sandbox Code Playgroud)
如果对象是类似数组的,并且可以从访问函数中获益,否则它将从数组原型继承,那么使它成为类似数组的对象会有什么好处呢?
编辑:如果在我的问题中不清楚,像对象这样的数组就像arguments是具有从零开始的连续数字属性的对象,并且具有比最高数字键小1的长度属性.它也不从数组原型继承,也不提供对数组方法的访问.
我正在阅读关于数组操作的运行时复杂性并了解到......
Array.push()运行在恒定和Array.unshift()在直线通过像数据结构的哈希表来实现稀疏数组时间[3] .现在,我在想是否push和unshift对相同的恒定分别线性时间复杂度密集阵列.Firefox/Spidermonkey的实验结果证实:
现在我的问题:
unshift没有用类似的常量运行时实现push(例如维护索引偏移;类似于perl数组)?arrays ×5
javascript ×5
object ×2
performance ×2
dynamic ×1
linked-list ×1
v8 ×1
weakly-typed ×1