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

数组的性能包括vs映射到一个对象并在JavaScript中访问它,javascript,arrays,json,performance,dictionary,Javascript,Arrays,Json,Performance,Dictionary,根据CS的基本原理 未排序列表的search功能必须在O(n)时间内出现,而对于HashMaps,直接访问数组将在O(1)时间内出现 那么,将数组映射到字典中,然后直接访问元素是否更有效,还是应该只使用includes?这个问题是专门针对JavaScript的,因为我相信这将归结为如何实现includes()和{}的核心实现细节 let y = [1,2,3,4,5] y.includes(3) 或者 确实,对象查找是在固定时间内进行的-O(1)-因此使用对象属性而不是数组是一种选择,但是如果

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

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

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


确实,对象查找是在固定时间内进行的-O(1)-因此使用对象属性而不是数组是一种选择,但是如果您只是尝试检查某个值是否包含在集合中,则更适合使用
,这是一个(通常无序的)值集合,也可以在线性时间内查找。(如果改用普通对象,则除了键之外还需要有值,这一点您并不关心,因此,请改用
。)

const set=新集合(['foo','bar']);
console.log(set.has('foo'));

console.log(set.has('baz'))于2020年4月29日更新

正如评论者正确指出的那样,V8似乎在优化数组包含调用。分配给var并使用它会产生更多的预期结果。在这种情况下,对象地址最快,其次是Set has,第三个是Array includes(在我的系统/浏览器上)

尽管如此,我还是坚持我最初的观点,即如果进行微观优化,就值得对假设进行测试。只需确保您的测试有效;)

原创

嗯。尽管对象地址和集合的性能明显优于Array includes,但Chrome的基准测试表明实现优于预期

在板凳上,我与Chrome Array includes竞争,他无疑是表现最好的

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

底线是,如果您正在进行微优化(不建议这样做),那么它值得进行基准测试,而不是假设哪种可能最适合您的特定情况。正如你的问题所暗示的那样,最终要归结到实现上。因此,目标平台的优化是关键

以下是我得到的结果:

节点(12.6.0):

对象地址7804199的操作 阵列的ops包括5200197 Set的ops为7178483
铬(75.0):


小心过早的优化。@MarkMeyer:)我只是好奇学习的目的。至于includes works如何从它的polyfill中获得想法,你知道集合是如何实现的吗?我不知道集合有线性时间查找。根据这个假设,我的猜测是,它在幕后实现为hashmap,但没有卫星数据。请参阅-“Set对象必须使用哈希表或其他机制来实现,这些机制平均提供的访问时间与集合中元素的数量呈次线性关系。”。一般来说,@CertainPerformance just Wast ask不是在集合中添加元素需要O(1)个时间。@amrendersingh是的,它是-添加属性是一个可预测的简单操作(比查看数据结构复杂得多)@CertainPerformance“但是,向集合中添加项目(就像向对象添加属性一样)是O(N)”这里您指的是添加多个元素以进行迭代设置?您的测试用例包含非常小的项目集,并且您不使用检查结果,因此我打赌JS JIT只是优化了数组中的访问。includes case。如果使用较大的样本大小并使用检查结果,则Set has操作的速度比Array.includes快40-100倍。对于字符串集(在macOS上的Chrome和Firefox上测试)。-即使是这个版本也有问题,因为我们没有测试负面查找(即列表中没有的项目)的速度。
let y = {
          1: true,
          2: true
          3: true
          4: true
          5: true
        }
5 in y