Javascript Object Big-O
Javascript Object Big-O
Java,Javascript对象让我想起了Java中的HashMap。
Javascript:
var myObject = {
firstName: "Foo",
lastName: "Bar",
email: "foo@bar.com"
};
爪哇岛:
HashMap<String, String> myHashMap = new HashMap<String, String>();
myHashMap.put("firstName", "Foo");
myHashMap.put("lastName", "Bar");
myHashMap.put("email", "foo@bar.com");
在 Java HashMap 中,它使用键的 hashcode(( 函数来确定存储和检索的存储桶位置(条目(。 大多数情况下,对于 put(( 和 get(( 等基本操作,性能是恒定时间,直到发生哈希冲突,对于这些基本操作,哈希冲突变为 O(n(,因为它形成链表以存储冲突的条目。
我的问题是:
- Javascript 存储对象如何?
- 操作性能如何?
- 是否会有任何冲突或其他情况会像在 Java 中那样降低性能
谢谢!
Javascript看起来像是将东西存储在地图中,但通常情况并非如此。您可以像访问映射中的索引一样访问对象的大多数属性,并在运行时分配新属性,但支持代码比仅使用映射更快、更复杂。
没有什么要求 VM 不使用映射,但大多数 VM 会尝试检测对象的结构并为该结构创建有效的内存中表示形式。这可能会导致程序运行时进行大量优化(和取消选择(,并且是一个非常复杂的情况。
这篇博文在@Zirak的问题评论中链接,对常见结构以及虚拟机何时可能从结构切换到映射进行了很好的讨论。它通常看起来不可预测,但主要基于 VM 中的一组启发式方法以及它认为它看到了多少个不同的对象。这在很大程度上与返回值的属性(及其类型(有关,并且往往以每个函数(尤其是构造函数(为中心。
有一些问题和文章深入探讨了细节(但希望在没有大量背景的情况下仍然可以理解(:
- V8 中对不同对象中的函数使用相同的键时调用慢速函数
- 为什么获得会员比调用hasOwnProperty更快?
- http://mrale.ph/blog/2013/08/14/hidden-classes-vs-jsperf.html(以及本博客的其余部分(
基于上述原因,性能差异很大。最坏的情况应该是映射访问,最好的情况是直接内存访问(甚至可能是 deref(。
有大量方案可能会影响性能,特别是考虑到 JITter 和 VM 在运行时将如何创建和销毁隐藏类,因为它们会在对象上看到新的变体。突然遇到以前假定为单态的对象的新变体可能会导致 VM 切换回不太理想的表示形式,并停止将该对象视为内存中结构,但围绕它的逻辑非常复杂,并且在此博客文章中进行了很好的介绍。
可以通过确保从同一构造函数创建的对象往往具有非常相似的结构,并使事情尽可能可预测(对你、维护和 VM 都有好处(来提供帮助。拥有每个对象的已知属性,设置这些属性的类型,并在可能的情况下从构造函数创建对象应该可以让您达到大多数可用的优化并拥有一些非常快速的代码。
- 函数未在Object.keys或Object.getOwnPropertyNames下列出,但可以调用
- delete在Object上效率低下,但在DOM Element's的数据属性,与null out相比
- 有没有一种方法可以列出Ember.Object的所有绑定
- 如何取消object.prototypes javascript的一个函数
- 为什么是文档.旧版应用程序中的DOM-object.properties为null
- 将*.js文件的内容放入Object中
- Object.prototype using 'this'
- 使用Object.create()的角度服务继承
- 如何使用object.assign()从其他对象引用基本对象属性
- 循环的数组推入在Object容器中具有不同的值
- reducers在redux中得到Function not Object,what'it’他错了
- JSON.stringify和Object.keys在同一个对象上产生不同的结果
- 为big js包构建脚本
- 在使用object.create创建的对象中使用super
- Join架构验证:Join.object定义数组中的有效键
- jquery打印[object XMLDocument]而不是文件内容
- ExtJS 4 Object.prototype fail
- JavaScript-从对象数组中输出随机OBJECT
- 为什么“{}+1”在Chrome和Firefox中排名第一,而字符串'[object object]1'
- Javascript Object Big-O