在我的大部分开发生涯中,我坚信应该避免多次迭代数组。 经过一番来回,我已经不太确定了,所以想问问大家的意见。
以下两个示例哪个性能更好?在我看来,两者都使用相同数量的 CPU 周期。
arrayOfAThousandElements.map(x => {doSmth(x); doSmthElse(x)})
这使用了 1000*2 个 cpu 周期,因为 doSmth 和 doSmthElse 仅使用一个周期。
arrayOfAThousandElements.map(x => doSmth(x)).map(x => doSmthElse(x))
这使用 1000 + 1000 个 CPU 周期。
第二个解决方案对我来说“感觉”较慢。但我不能争论它。我错过了什么吗?
第二种解决方案会慢一些。您对“CPU 周期”的比较忽略了迭代本身的开销(翻倍)以及创建中间数组的开销。但除非功能非常琐碎,否则这种开销通常可以忽略不计。
另请注意,这两个代码实际上并不等效。你的第二个版本实际上相当于
arrayOfAThousandElements.map(x => doSmthElse(doSmth(x)))
因为第一个
map()
返回 doSmth(x)
结果的数组,这就是第二个 map()
映射的内容。仅当 doSmth()
返回其参数时,它们才等效。