2

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

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 对我来说不是问题,因为其他原因我已经在我的代码中使用了它。

4

1 回答 1

9

当想知道性能时,获得答案的一种方法是在 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 在此处输入图像描述

我们看到该数组因“大”键计数而失败。
所以你必须弄清楚你所处的情况。
通过一点点计数,处理属性的开销使数组获胜。
由于键数很大,在数组内迭代的成本使属性胜...

于 2013-09-09T22:22:39.000 回答