Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript性能:对象中的简单键搜索与数组中的值搜索_Javascript_Arrays_Performance_Object_Set - Fatal编程技术网

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

JavaScript性能:对象中的简单键搜索与数组中的值搜索,javascript,arrays,performance,object,set,Javascript,Arrays,Performance,Object,Set,我需要在JavaScript中进行模拟——即,能够回答问题“我是否包含x?”的变量 插入/删除的性能并不重要。秩序不重要。事实并非如此 有两种方法可以实现它: 使用带值搜索的正则数组: var set = [17, 22, 34]; if (set.indexOf(x)!=-1) ...; 1a。如有可能,使用(例如): var set = Int32Array.of(17, 22, 34); if (set.indexOf(x)!=-1) ...; 将对象与键搜索一起使用: var

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

插入/删除的性能并不重要。秩序不重要。事实并非如此

有两种方法可以实现它:

  • 使用带值搜索的正则数组:

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

      var set = Int32Array.of(17, 22, 34);
      if (set.indexOf(x)!=-1) ...;
      
  • 将对象与键搜索一起使用:

    var set = {17: true, 22: true, 34: true};
    if (set[x]) ...;
    
  • 从理论上讲,对象键搜索应该快得多(取决于他们在JS引擎中如何实现它,在数组值搜索中应该是O(log(n))或O(1)-vs O(n)。然而,JavaScript中是否存在这种情况(在JavaScript中,访问对象成员可能需要多次查找)-尤其是在包含数十个项的小集合上?假设集合中的值非常简单(整数或短字符串)

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


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

    我对此也很好奇,我使用与NodeJS 6.3上的jsPerm相同的堆栈进行了大部分分析:

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

    测试被插入、查找和插入+查找打破

    结果如下:

    • 使用Object(基本上是HashMap)进行查找的速度从16个元素增加到1个元素
    • 对于对象关键点,插入速度非常慢
    • 插入+查找,无论大小,数组总是更快

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

    请检查。@Andreas,此网站的问题是它不发布结果(如果我可以看到其他用户的结果,并提供指定的日期/其他信息,则会更好;编写测试所需的时间可能比在不同的浏览器中运行测试所需的时间要少)。不过,谢谢你,现在我看到,即使是在小型集合上,对象键搜索也会更快,至少在Firefox/Linux/64位上是如此。也许我以后会写我自己的测试,并将它(连同结果)发布在这里作为答案。