【问题标题】:Duplicate Checking vs Creating a set typescript重复检查与创建一组打字稿
【发布时间】:2021-12-12 09:32:30
【问题描述】:

有点基本的问题,在遍历对象数组时,我需要建立一个唯一字符串列表,在循环中添加 if 语句会比创建集合更好吗?

if (!arr.includes(newString)) arr.push(newString)

VS push所有字符串,然后

arr = [ ...new Set(arr) ]

【问题讨论】:

  • 在什么意义上更好?
  • 处理大列表时的性能(哪个使用更多内存/更多处理),我知道传统上添加 if 语句被认为是不好的,因为 Typescript 是如何编译的,但我不知道Set 是如何在后台工作的(同时我会去研究一下)
  • 内存和运行时性能是不同的指标。这些指标也取决于环境(例如 JS 引擎)。如果这确实是您的问题,那么您需要更加具体。

标签: typescript performance duplicates


【解决方案1】:

Set 快得多,快得多

让我们在jsbench.me上做一个测试

设置:

让我们创建一个编号为 0-9999 的数组,然后为 20,000 个项目再次创建一个 0-9999,每个项目都有一个重复项。

const data = []
for (let i = 0; i < 10000; i++) data.push(i)
for (let i = 0; i < 10000; i++) data.push(i)

循环测试:

let arr = []
for (let n of data) {
  if (!arr.includes(n)) arr.push(n) 
}

每秒 9.72 次执行

设置测试:

let arr = [ ...new Set(data) ]

每秒执行 1422.54 次


Run the test yourself here

所以Set 快了 146 倍(在我的机器上)

我怀疑这是因为Set 是用本机编译代码实现的,如果做得好,简单的性能和效率是无法比拟的。而且您可以相信内置函数的浏览器实现可能非常非常好。

你可以做的任何事情来避免大​​型数组上的循环对性能来说都是一件好事。

【讨论】:

  • 一切都在某些时候用编译代码实现 =) 区别在于查找项目所需的底层数据结构和时间复杂性。如果使用哈希,在纯 JS 中也可以非常快地完成一些事情。
  • 最简单的版本是使用一个对象,并将项目存储为键。
  • 我做了一个版本,虽然它慢了(但没那么慢):const arr = Array.from( Object.keys( Object.fromEntries( data.map(item =&gt; [item, true]) ) ) );
猜你喜欢
  • 2017-10-03
  • 2020-05-03
  • 2020-09-28
  • 2017-11-01
  • 2022-07-20
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多