Javascript Object Big-O

Javascript Object Big-O

本文关键字:Big-O Object Javascript      更新时间:2023-09-26
来自

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(,因为它形成链表以存储冲突的条目。

我的问题是:

  1. Javascript 存储对象如何?
  2. 操作性能如何?
  3. 是否会有任何冲突或其他情况会像在 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 都有好处(来提供帮助。拥有每个对象的已知属性,设置这些属性的类型,并在可能的情况下从构造函数创建对象应该可以让您达到大多数可用的优化并拥有一些非常快速的代码。