Javascript对象来自Java,它让我想起了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");
在HashMap中,它使用键的hashcode()函数来确定存储和检索的桶位置(条目)。在大多数情况下,对于put()和get()等基本操作,性能是恒定的,直到发生哈希冲突(对于这些基本操作变成O(n) ),因为它形成一个链接列表以存储冲突的条目。
我的问题是:
谢谢!
发布于 2015-02-04 19:42:02
Javascript看起来像是在地图中存储东西,但通常情况并非如此。您可以像访问映射中的索引一样访问对象的大多数属性,并在运行时分配新的属性,但是备份代码比仅仅使用映射要快得多,也要复杂得多。
不需要VM不使用映射,但是大多数都试图检测对象的结构,并为该结构创建有效的内存中表示。在程序运行时,这会导致大量的优化(和取消),这是一个非常复杂的情况。
这篇博客文章在@Zirak的问题评论中进行了链接,它很好地讨论了常见的结构,以及VM何时可以从struct切换到map。它通常看起来不可预测,但在很大程度上是基于VM中的一组启发式方法,以及它认为它看到了多少不同的对象。这在很大程度上与返回值的属性(及其类型)有关,并且倾向于围绕每个函数(特别是构造函数)。
有几个问题和文章深入到细节(但希望仍然可以理解没有大量的背景):
基于以上情况,性能差别很大。最坏的情况应该是映射访问,最好的情况是直接访问内存(甚至可能是一个deref)。
有大量的场景可能会对性能产生影响,特别是考虑到JITter和VM将如何在运行时创建和销毁隐藏类,因为它们看到了对象上的新变体。突然遇到一个被认为是单一形式的对象的新变体会导致VM切换回一个不太理想的表示,并停止将对象作为内存中的结构来处理,但是它周围的逻辑非常复杂,并且在这篇博客文章中得到了很好的覆盖。
您可以确保从同一个构造函数创建的对象具有非常相似的结构,并使事情尽可能可预测(这对您、维护和VM都有好处)。知道每个对象的属性之后,为这些属性设置类型,并在可以的时候从构造函数中创建对象,这样就可以实现大多数可用的优化,并有一些非常快速的代码。
https://stackoverflow.com/questions/28329869
复制相似问题