【问题标题】:Is checking an object for a key more efficient than searching an array for a string? [duplicate]检查对象的键是否比在数组中搜索字符串更有效? [复制]
【发布时间】:2013-09-13 09:44:01
【问题描述】:

我正在创建一个数据结构,其中包含我将用来重复检查是否定义了某些值的数据结构。我想出了两种可能的解决方案,我想知道哪个更有效,或者是否有更好的方法:

1) 使用数组:keys = ['key1' , 'key2', 'key3']

我可以像这样创建一个数组,然后使用jQuery.inArray(keyToCheck, keys) > -1 来检查keyToCheck 是否在我的数组中。

2) 使用对象:keys = {key1 : 1, key2 : 1, key3: 1}

我可以创建这个对象,然后使用keys[keyToCheck] || 0 来查看是否定义了keyToCheck

我不确定的是如何在 javascript 中实现搜索对象,以及它是否比循环数组的 jQuery.inArray 更有效。这些方法之间是否存在性能差异?使用 jQuery 对我来说不是问题,因为其他原因我已经在我的代码中使用了它。

【问题讨论】:

  • 正如another question 所说,对象查找至少应该是线性的。
  • 您将苹果与橙子进行比较,在数组的情况下,您正在搜索任何键的值,而在对象的情况下,您正在搜索特定的键并忽略价值。如果您改为查找数组中的特定键与对象中的特定键,那将是更接近的比较。
  • 对于因主要基于意见而投票结束此问题的人来说,一种方法是否比另一种更有效是一个意见问题,而不是推测。
  • inArray() 非常慢,对象查找非常快,在 V8 中几乎是即时的......关于线性 this 或 that 的理论内容与针对单个用户-land 循环进行竞赛相比毫无意义本机属性查找。无论如何,JIT 会欺骗大多数 C++ 基准测试。如果您希望代码更快,请使用查找表而不是数组。

标签: javascript jquery arrays


【解决方案1】:

当想知道性能时,获得答案的一种方法是在 jsperf 上测试几个案例。
(可能还有其他我不知道的基准站点,如果您知道另一个,请发表评论,我不是要打广告)

对于您的情况,我测试了 3 种方法:
- 在数组中使用 indexOf
- 使用“in”运算符
- 测试对象的属性值

psperf 在这里大约有 10 个项目在这里: http://jsperf.com/key-or-array-search/2

我们可以看到,在 Firefox 上使用对象的属性值要快得多(比数组快 >20 倍,比 in 快 >5 倍)。
在 Safari 上,一切都比在 Firefox 上慢,但对象属性访问仍然快两倍以上。
但是在 Chrome 上我不明白发生了什么:所有 3 种方法都非常接近,但最快的是 array/indexOf 方法,...

表现往往令人惊讶。

请注意,结果可能会根据键的数量(5、20、5000?)以及选中的键在集合中的概率而发生变化 - 甚至会发生巨大变化。

我想知道使用 500 长度的键数组会如何改变。以下是结果: http://jsperf.com/key-or-array-search/3

我们看到数组因“大”键计数而失败。
所以你必须弄清楚你所处的情况。
只需少量键数,处理属性的开销就可以使数组获胜。
使用大量键数,在数组内迭代的成本使属性获胜...

【讨论】:

    猜你喜欢
    • 2020-07-27
    • 2013-05-20
    • 1970-01-01
    • 2021-03-18
    • 2021-02-28
    • 2020-03-25
    • 1970-01-01
    • 2023-03-30
    • 2020-04-26
    相关资源
    最近更新 更多