首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Javascript对象Big-O

Javascript对象Big-O
EN

Stack Overflow用户
提问于 2015-02-04 19:34:40
回答 1查看 3.3K关注 0票数 17

Javascript对象来自Java,它让我想起了Java中的HashMap。

Javascript:

代码语言:javascript
运行
复制
var myObject = {
    firstName: "Foo",
    lastName: "Bar",
    email: "foo@bar.com"
};

爪哇:

代码语言:javascript
运行
复制
HashMap<String, String> myHashMap = new HashMap<String, String>();
myHashMap.put("firstName", "Foo");
myHashMap.put("lastName", "Bar");
myHashMap.put("email", "foo@bar.com");

在HashMap中,它使用键的hashcode()函数来确定存储和检索的桶位置(条目)。在大多数情况下,对于put()和get()等基本操作,性能是恒定的,直到发生哈希冲突(对于这些基本操作变成O(n) ),因为它形成一个链接列表以存储冲突的条目。

我的问题是:

  1. Javascript如何存储对象?
  2. 操作的性能如何?
  3. 会不会有任何冲突或其他情况会降低性能,比如在Java中

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-04 19:42:02

Javascript看起来像是在地图中存储东西,但通常情况并非如此。您可以像访问映射中的索引一样访问对象的大多数属性,并在运行时分配新的属性,但是备份代码比仅仅使用映射要快得多,也要复杂得多。

不需要VM不使用映射,但是大多数都试图检测对象的结构,并为该结构创建有效的内存中表示。在程序运行时,这会导致大量的优化(和取消),这是一个非常复杂的情况。

这篇博客文章在@Zirak的问题评论中进行了链接,它很好地讨论了常见的结构,以及VM何时可以从struct切换到map。它通常看起来不可预测,但在很大程度上是基于VM中的一组启发式方法,以及它认为它看到了多少不同的对象。这在很大程度上与返回值的属性(及其类型)有关,并且倾向于围绕每个函数(特别是构造函数)。

有几个问题和文章深入到细节(但希望仍然可以理解没有大量的背景):

基于以上情况,性能差别很大。最坏的情况应该是映射访问,最好的情况是直接访问内存(甚至可能是一个deref)。

有大量的场景可能会对性能产生影响,特别是考虑到JITter和VM将如何在运行时创建和销毁隐藏类,因为它们看到了对象上的新变体。突然遇到一个被认为是单一形式的对象的新变体会导致VM切换回一个不太理想的表示,并停止将对象作为内存中的结构来处理,但是它周围的逻辑非常复杂,并且在这篇博客文章中得到了很好的覆盖。

您可以确保从同一个构造函数创建的对象具有非常相似的结构,并使事情尽可能可预测(这对您、维护和VM都有好处)。知道每个对象的属性之后,为这些属性设置类型,并在可以的时候从构造函数中创建对象,这样就可以实现大多数可用的优化,并有一些非常快速的代码。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28329869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档