Jay*_*Pea 6 javascript associative-array hashtable
因此,假设您在JavaScript中有一个关联数组:
var hashTable = {};
hashTable["red"] = "ff0000";
hashTable["green"] = "00ff00";
hashTable["blue"] = "0000ff";
Run Code Online (Sandbox Code Playgroud)
检索如下值时会发生什么:
var blue = hashTable["blue"];
Run Code Online (Sandbox Code Playgroud)
性能是否与其他语言的哈希表类似?我的意思是,是否存在用于确定属性位置的实际哈希函数,或者是否存在循环搜索,例如:
for (var color in hashTable) {
if (hashTable.hasOwnProperty(color)) {
//look for matching key
}
}
Run Code Online (Sandbox Code Playgroud)
实施方式因浏览器而异吗?我找不到任何与此特定主题相关的内容.谢谢.
它在不同的 javascript 引擎中的实现方式不同,而且现在看来,对象并没有得到“类似字典”的数据结构的支持。
来自https://developers.google.com/v8/design:
JavaScript 是一种动态编程语言:可以动态地向对象添加和删除属性。这意味着对象的属性可能会发生变化。大多数 JavaScript 引擎使用类似字典的数据结构作为对象属性的存储 - 每个属性访问都需要动态查找来解析属性在内存中的位置。这种方法使得访问 JavaScript 中的属性通常比访问 Java 和 Smalltalk 等编程语言中的实例变量慢得多。在这些语言中,由于对象的类定义了固定的对象布局,实例变量位于由编译器确定的固定偏移处。访问只是内存加载或存储的问题,通常只需要一条指令。
为了减少访问 JavaScript 属性所需的时间,V8 不使用动态查找来访问属性。相反,V8 在幕后动态创建隐藏类。这个基本思想并不新鲜——基于原型的编程语言Self使用地图来做类似的事情。在 V8 中,当添加新属性时,对象会更改其隐藏类。
Firefox 的 IonMonkey 也做了类似的事情。来自 Mozilla 开发人员的采访 ( http://www.infoq.com/news/2011/05/ionmonkey ):
动态语言可能没有任何固有的优化优势,但它们确实具有静态语言所没有的有趣的优化。例如,当您编写 JavaScript 时,对象对用户显示为哈希表,将属性名称映射到值。如果它们实际上是这样实现的,它们会很慢并且会使用大量内存。
一个好的引擎能够在内部对看起来相同的对象进行分组,从而从它们中提取出一个类似于 Java 的内部类。然后,JIT 可以将对象视为具有实际类型,从而生成超快的代码,从而避免昂贵的属性查找。
| 归档时间: |
|
| 查看次数: |
938 次 |
| 最近记录: |