数组的性能包括vs映射到对象并在JavaScript中访问它

时间:2018-11-22 04:29:37

标签: javascript arrays json performance dictionary

根据CS的基本原理 未排序列表的search功能必须在O(n)时间内发生,而对于HashMaps,直接访问数组将在O(1)时间内发生。

那么将数组映射到字典中然后直接访问该元素是否更有效?还是应该只使用include?这个问题专门针对JavaScript,因为我认为这将取决于如何实现includes(){}的核心实现细节。

let y = [1,2,3,4,5]
y.includes(3)

或...

let y = {
          1: true,
          2: true
          3: true
          4: true
          5: true
        }
5 in y

2 个答案:

答案 0 :(得分:5)

好吧。尽管有一个明显的预期,即对象地址和集合的性能应优于Array includes,但针对Chrome的基准测试表明实施效果胜过预期。

在针对Chrome Array的测试中,我的表现一直都是最好的。

我还使用Node在本地进行了测试,并获得了更多预期结果。在对象地址获胜的情况下,紧随其后的是Set,然后Array includes的速度要慢于两者。

最重要的是,如果您要进行微优化(不建议这样做),则值得进行基准测试,而不是假设哪种方法最适合您的特定情况。最终,将取决于您的问题所暗示的实现。因此,针对目标平台进行优化是关键。

这是我得到的结果:

节点(12.6.0):

ops for Object address 7804199
ops for Array includes 5200197
ops for Set has        7178483

Chrome(75.0):
https://jsbench.me/myjyq4ixs1/1

benchmark against Chrome

答案 1 :(得分:4)

确实,对象查找是在线性时间内发生的,因此使用对象属性而不是数组是一种选择,但是如果您只是尝试检查某个值是否包含在集合中,则使用它会更合适Set,它是值的(通常是无序的)集合,也可以在线性时间内查找它们。 (相反,使用普通对象将要求您除了密钥外还具有 values ,而您不必关心-因此,请改用Set。)

const set = new Set(['foo', 'bar']);
console.log(set.has('foo'));
console.log(set.has('baz'));

当您必须为同一Set查找多个值时,这将很有用。但是,将项目添加到Set(就像向对象添加属性一样)是O(N),因此,如果您只想查找一个值,一次,这种方法和对象技术都没有好处,您也可以只使用数组includes测试。