1

附加说明:

我确实检查了这个先前的答案,并希望得到一个更新的答案,而不是 Chrome 特定的答案:JavaScript 对象中键查找的性能

假设一个标准的 javascript“字典”对象具有如下属性:

var myObject = {
   Key1: ”Value1”,
   Key2: ”Value2”,
   Key3: ”Value3”,
   …
   Key500: ”Value500”
}

有谁知道浏览器(等)是否在内部优化了它们对这些属性的检索?

一个很好的例子可能是自动排序 + 二分搜索。

一个不太好的情况可能是简单的线性搜索。

EcmaScript 标准规定浏览器可以按照自己的意愿进行内部操作:

[浏览器等] 可以支持具有任何依赖于实现的行为的 [对象的] 内部属性,只要它符合本文档中所述的特定主机对象限制。

枚举属性的机制和顺序……没有指定。

我真的不需要知道具体的优化,我只想知道他们是否试图优化超越简单的线性搜索。

那么,有人有“内部”知识吗?

4

2 回答 2

5

这取决于浏览器和 JavaScript 引擎。Google 的 V8 动态创建隐藏类而不是动态查找,以减少用于访问属性的时间。使用隐藏类还具有使用基于类的优化(例如内联缓存)的额外好处。

在“快速属性访问”部分下有更多信息。这个想法基本上来自这篇论文:An Efficient Implementation of Self, a Dynamically-Typed Object-Oriented Language Based on Prototypes

Internet Explorer 有一个“快速类型系统”来优化属性访问。此演示文稿中的更多详细信息。

Mozilla 的 SpiderMonkey 引擎使用属性缓存(警告:细节有些过时,但它基本上仍然使用属性缓存)。

新的 IonMonkey 引擎使用内联属性缓存,但目前为止细节似乎很少。

于 2013-04-19T18:29:23.483 回答
2

Yes. The specification does not require such optimications, as you have already noted, but it can be observed empirically. I tested how quickly keys are grabbed from objects that contain up to 500,000 elements. (test here, be warned that it will freeze your browser for a little while).

The key retrieval time does not increase with the size of the object, which means that it has O(1) time complexity for search.

于 2013-04-19T18:46:16.150 回答