代码之家  ›  专栏  ›  技术社区  ›  Luke Xu

数组的性能包括vs映射到一个对象并在JavaScript中访问它

  •  1
  • Luke Xu  · 技术社区  · 7 年前

    根据CS的基本原理 这个 search 未排序列表的功能必须在O(n)时间内实现,而对于HashMaps,直接访问数组将在O(1)时间内实现。

    那么,将数组映射到字典中,然后直接访问元素是否更有效,还是应该只使用includes?这个问题是专门针对JavaScript的,因为我相信这将归结为如何实现的核心实现细节 includes() 和 {} 实现了。

    let y = [1,2,3,4,5]
    y.includes(3)
    

    或

    let y = {
              1: true,
              2: true
              3: true
              4: true
              5: true
            }
    5 in y
    
    1 回复  |  直到 7 年前
        1
  •  20
  •   Alisson Reinaldo Silva    5 年前

    Set ,这是一个(通常是无序的)值集合,也可以在线性时间内查找(如果使用普通对象,则需要 价值观 除了你不在乎的钥匙之外——所以,使用 相反。)

    const set = new Set(['foo', 'bar']);
    console.log(set.has('foo'));
    console.log(set.has('baz'));

    当您必须查找时,这将非常有用 多值 同样 设置 . 但是,将项目添加到 设置 (就像向对象添加属性一样)是 O(N) 只需查找一个值,一次 includes 测试。

        2
  •  13
  •   andrew.carpenter    6 年前

    正如评论者正确指出的那样,V8似乎在优化数组包含调用。 An updated version 分配给var并使用它会产生更多的预期结果。在这种情况下,对象地址最快,其次是Set has,第三个是Array includes(在我的系统/浏览器上)。

    尽管如此,我还是坚持我最初的观点,即如果进行微观优化,就值得对假设进行测试。只需确保您的测试有效;)

    起初的

    好。尽管对象地址和集合的性能明显优于Array includes,但Chrome的基准测试表明实现优于预期。

    我还使用Node进行了本地测试,获得了更多预期结果。在这种情况下,对象地址获胜,紧随其后的是Set has,那么Array includes的速度略慢于两者。

    节点(12.6.0):

    ops for Object address 7804199
    ops for Array includes 5200197
    ops for Set has        7178483
    

    铬(75.0):
    https://jsbench.me/myjyq4ixs1/1

    benchmark against Chrome