我正在创建一个数据结构,其中包含我将用来反复检查以查看是否定义了某些值的数据结构。我想出了两个可能的解决方案,我想知道哪个更有效率,或者是否有更好的方法:
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对我来说不是问题,因为我已经在我的代码中出于其他原因。
答案 0 :(得分:7)
当想知道表演时,获得答案的方法是在jsperf上测试几个案例 (可能还有其他我不知道的基准网站,如果你知道另一个,请发表评论,我不是故意做广告)
对于您的情况,我测试了3种方法:
- 在数组中使用indexOf
- 使用'in'操作员
- 测试对象的属性值
psperf在这里大约有10个项目在这里: http://jsperf.com/key-or-array-search/2
我们可以看到在Firefox上使用对象的属性值要快得多(>比阵列快20倍,> 5倍)。 在Safari上,一切都比在Firefox上慢,对象属性访问速度仍然快两倍以上 但是在Chrome上我不明白发生了什么:所有3种方法都非常接近,但最快的是数组/ indexOf方法,......
表演通常令人惊讶。
请注意,结果可能会发生变化 - 甚至会发生显着变化 - 取决于键的数量(5,20,5000?),以及检查键在集合中的概率。
我想知道500长度的密钥数组会发生什么变化。结果如下: http://jsperf.com/key-or-array-search/3
我们看到数组因“大”键数而被击败
所以你必须弄清楚你所处的情况。
通过一点键计数,处理属性的开销使得数组获胜
使用大的密钥数,在数组中迭代的成本使得属性获胜......