【问题标题】:JavaScript performance: simple key search in object vs value search in arrayJavaScript 性能:对象中的简单键搜索与数组中的值搜索
【发布时间】:2016-04-22 02:15:44
【问题描述】:

我需要在 JavaScript 中模拟 set — 即能够回答问题“我是否包含 x?”的变量。

插入/删除的性能无关紧要。顺序无所谓。而且不是multiset

有两种实现方式:

  1. 使用常规数组进行值搜索:

    var set = [17, 22, 34];
    if (set.indexOf(x)!=-1) ...;
    
    • 1a。尽可能使用TypedArray(例如Int32Array):

      var set = Int32Array.of(17, 22, 34);
      if (set.indexOf(x)!=-1) ...;
      
  2. 使用带有键搜索的对象:

    var set = {17: true, 22: true, 34: true};
    if (set[x]) ...;
    

理论上对象键搜索应该快得多(取决于他们如何在 JS 引擎中实现它,它应该是 O(log(n))O(1) — 与 O(n) 的数组值搜索相比)。但是,这是 JavaScript 中的一种情况吗(访问对象成员可能需要多次查找)——尤其是在具有数十个项目的小型集合上?假设 set 中的值非常简单(整数或短字符串)。

继续。我想知道:在以下情况下,使对象键搜索比数组值搜索更快需要多少设置项:(1)值是整数; (2) 值是短字符串——在现代 (2015/2016) 网络浏览器中?

我知道我可以自己进行测量,但是让每个开发人员测量相同的东西似乎是不合理的——所以我把这个问题放在这里以防有人做过。

【问题讨论】:

  • 查看this topic
  • @Andreas,这个网站的问题是它没有发布结果(如果我能看到具有指定日期/其他信息的其他用户的结果会更好;它可能需要更少的时间编写测试的时间比在不同的浏览器中运行它的时间)。无论如何,谢谢,现在我发现对象键搜索即使在小型集合上也更快,至少在 Firefox/Linux/64 位上是这样。也许我稍后会编写自己的测试并在此处发布(带有结果)作为答案。

标签: javascript arrays performance object set


【解决方案1】:

我也对此感到好奇,我在 NodeJS 6.3 上使用与 jsPerm 相同的堆栈完成了大部分分析:

https://github.com/amoldavsky/js-array-indexof-vs-hashmap

输入数据是各种大小的数组( 2^x 其中 x = 0 .. 11 )和 1 到 2 个字符的短键。

插入、查找和插入 + 查找会破坏测试。

结果是:

  • 使用 Object(基本上是 HashMap)查找从 16 个元素向上更快
  • 对象键的插入速度非常慢
  • 插入 + 查找,无论大小如何,数组总是更快

还必须考虑数据集中的重复项...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-30
    • 2017-07-22
    • 2013-04-02
    相关资源
    最近更新 更多