重复检查与创建一套打字稿
Duplicate Checking vs Creating a set typescript
有点基本的问题,在遍历对象数组时,我需要建立一个唯一字符串列表,在循环中添加一个 if 语句会比创建一个集合更好吗?
if (!arr.includes(newString)) arr.push(newString)
VS
推所有字符串然后
arr = [ ...new Set(arr) ]
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 次
所以 Set
比 快 146 倍(在我的机器上)
我怀疑这是因为 Set
是用本机编译代码实现的,如果做得好,它的性能和效率是无与伦比的。你可以相信,内置的浏览器实现可能非常非常好。
此外,您可以采取任何措施来避免对大型数组进行循环,这对提高性能来说是一件好事。
有点基本的问题,在遍历对象数组时,我需要建立一个唯一字符串列表,在循环中添加一个 if 语句会比创建一个集合更好吗?
if (!arr.includes(newString)) arr.push(newString)
VS 推所有字符串然后
arr = [ ...new Set(arr) ]
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 次
所以 Set
比 快 146 倍(在我的机器上)
我怀疑这是因为 Set
是用本机编译代码实现的,如果做得好,它的性能和效率是无与伦比的。你可以相信,内置的浏览器实现可能非常非常好。
此外,您可以采取任何措施来避免对大型数组进行循环,这对提高性能来说是一件好事。