JavaScript性能:对象中的简单键搜索与数组

时间:2016-01-16 15:40:27

标签: javascript arrays performance object set

我需要在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]) ...;
    
  3. 理论上对象键搜索应该更快(取决于它们在JS引擎中如何实现它,它应该是 O(log(n)) O(1)< / em> - vs O(n)关于数组值搜索)。但是,这是JavaScript中的一种情况(对象成员的访问可能需要多次查找) - 特别是在包含数十个项目的小集上?假设set中的值非常简单(整数或短字符串)。

    恢复。我想知道:在以下情况下,使对象键搜索比数组值搜索更快所需的最小设置项数量是:(1)值是整数; (2)值是短字符串 - 在现代(2015/2016)网络浏览器中?

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

1 个答案:

答案 0 :(得分:2)

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

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

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

通过插入,查找和插入+查找来破坏测试。

结果是:

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

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