【问题标题】:What is the right way to find out which function is faster? [duplicate]找出哪个功能更快的正确方法是什么? [复制]
【发布时间】:2020-10-03 09:04:16
【问题描述】:

我的代码中有两个函数,一个使用 map(),另一个使用 filter()

const eip = [...new Map(elasticIps.map(e  => [e.publicIp, e])).values()];

const eip = elasticIps.filter((v,i,a)=>a.findIndex(t=>(t.publicIp === v.publicIp))===i)

他们都为我做完全相同的事情,但我不知道找出哪个更快的最佳方法

【问题讨论】:

  • 第二个使用嵌套for循环,所以时间复杂度是O(n ^ 2)
  • 问题与“函数式编程”无关。对于结果/语义相同的任何函数 g 和 f,问题都是相同的。
  • 这段代码的“性能”也取决于元素的数量。对于小尺寸,它不相关。对于大尺寸,一个明显更好,因为基本复杂性不同。我可能会使用没有额外性能信息的第一种形式(缩进略有不同),因为它更好地“吸引我的眼睛”到唯一性意图,并且可能避免大量项目的一些糟糕情况。
  • 用真实世界的数据进行测试。例如:对于特定数据集和要求,快速排序可能比 O(N^2) 和 O(N^3) 算法慢。一般来说,第一个应该是最好的(它也恰好是最优雅的)。此外,如果您处于对象初始化和微选择成为一个因素(这不太可能)的情况下,就地改变一个对象而不是第一个对象会更快。即使你的语法可能是最优雅的。

标签: javascript typescript performance performance-testing


【解决方案1】:

您可以为此使用 console.time("label")console.timeEnd("label")

例如:

console.time("mapWay")
const eip = [...new Map(elasticIps.map(e  => [e.publicIp, e])).values()];
console.timeEnd("mapWay")

console.time("filterWay")
const eip = elasticIps.filter((v,i,a)=>a.findIndex(t=>(t.publicIp === v.publicIp))===i)
console.timeEnd("filterWay")

你会得到你在console.time()中设置的标签的毫秒结果

如果你想使用一些工具来检查基准,你可以使用:

https://jsben.ch/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-26
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2014-10-04
    • 2021-06-24
    • 2016-09-03
    相关资源
    最近更新 更多