看看下面的代码示例:
var myObject = {};
var i = 100;
while (i--) {
myObject["foo"+i] = new Foo(i);
}
console.log(myObject["foo42"].bar());
我有几个问题。
做的主要动力(IE,Mozilla的浏览器,Safari浏览器),使用什么样的数据结构存储键值对? 我希望这是某种形式的二叉搜索树,但我认为他们可能会使用链表(由于迭代被插入的顺序进行)。
如果他们使用搜索树,它是自平衡? 因为与传统的搜索树上面的代码将用于搜索创建一个不平衡的树,导致O(N)的最坏的情况下,而不是O(log n)的一个平衡的树。
我只要求这一点,因为我会写一个库,将需要的数据结构按键有效检索,而我可以实现我自己的或现有的红黑树我,如果他们宁愿使用本地对象属性足够的效率。
现在的问题是很难回答的一对夫妇的原因。 首先,现代的浏览器,而它正在执行如此选择访问属性可能是相同的代码不同的算法很大程度上都和动态优化代码。 第二,每个引擎使用不同的算法和试探法来确定要使用的访问算法。 三,ECMA规范要求什么的结果必然是,结果都不怎么实现这样的发动机具有很大的自由度在这个领域进行创新。
也就是说,鉴于你的榜样所有我熟悉的发动机将使用某种形式的哈希表的检索与关联的值foo42
从myobject
。 如果您使用的东西,比如关联数组JavaScript引擎将倾向于一个哈希表。 没有,我知道用树串属性。 哈希表是最坏的情况下O(N),最好的情况下O(1)和往往是更接近O(1)比O(N),如果密钥生成是任何好处。 每台发动机都会有,你可以用它来得到它来执行O(N)的模式,但是,这将是为每个引擎不同。 平衡树将保证最坏情况下为O(log N),但修改平衡树,同时保持它的平衡是不为O(log N)和哈希表的往往比为O(log N)更好地为字符串键且为O(1)更新(一旦你确定你需要,这是相同的大O为已读)如果在表(定期O(N空间)重建表,但表通常在空间,这意味着你只需支付一倍O(N)7或8倍于该表的寿命)。
数值属性是特殊的,但是。 如果使用具有在范围几个或没有间隙整数数值属性访问一个对象,即,使用对象像它是一个数组,值将趋于被存储在与O(1)存取存储器的线性块。 即使您的访问有差距的发动机将可能转移到这很可能将是,在最坏的情况,O(日志N)的稀疏数组访问。
通过标识访问属性也是特殊的。 如果你访问属性一样,
myObject.foo42
和经常执行该代码(即,在此速度事项),并用相同或相似的对象,这是可能被优化成一个或两个机器指令。 是什么让类似的对象也不同,每个引擎,但如果它们被相同的文字或功能构建,他们更可能被视为类似。
没有引擎,做所有好上的JavaScript基准测试将使用相同的算法对每个对象。 他们都必须动态确定是如何被使用的对象,并尝试调整相应的接入算法。
文章来源: What is the complexity of retrieval/insertion in JavaScript associative arrays (dynamic object properties) in the major javascript engines?