【问题标题】:How to optimize/debug nonperformant javascript code如何优化/调试性能不佳的 javascript 代码
【发布时间】:2017-06-15 21:49:13
【问题描述】:

我正在尝试为 lulz 完成 CodeWars 挑战,但我似乎无法获得足够的性能来通过提交。该解决方案是正确的并且通过了所有测试,但它没有通过性能测试,耗时 > 120000 毫秒

我的两个问题

  1. 如何调试性能问题?我不知道如何开始调试性能和识别性能不佳的代码,或者如何有意识地优化代码

  2. 此特定代码有什么问题?是否存在我执行不正确的模式?代码的某些部分是否发生了太多次?

详细要求可以在这里找到: https://www.codewars.com/kata/integers-recreation-one ```

//generate an array of range, containing every number M to N
//map1: for each  number find all divisors
//map2: for each array of divisors, format answer for tests
//filter out undefined results
let listSquared = (m, n) => range(m,n)
    .map(nextNumberInRange => findDivisors(nextNumberInRange))
    .map(arrayOfDivisors => formatAnswer(
            arrayOfDivisors[arrayOfDivisors.length - 1],
            squareAndSumAll(arrayOfDivisors)))
    .filter(x => x !== undefined)


//if the square root of y (the sum of squared divisors) is WHOLE, return [x,y]
let formatAnswer = (x,y) => Math.sqrt(y) % 1 === 0 ? [x,y] : undefined
//find all divisors of any integer
let findDivisors = (x) => range(1,x).filter(y => x%y === 0 || y===x)
//generate an array containing values from start to end.
//e.g. 100-500, 351-293487 etc. 
let range = (start,end) => [...Array((end-start)+1)].map((x,i)=> start+i)


let squareAndSumAll = (x) => x.map(square).reduce(add)
let add = (x,y) => x + y
let square = (x) => x * x

详细要求可以在这里找到: https://www.codewars.com/kata/integers-recreation-one

您应该能够将代码添加到他们网站上的窗口中,并重新创建通过的输入和失败的计时器测试。

【问题讨论】:

    标签: javascript performance optimization


    【解决方案1】:

    你检查过 chrome 59 上的新工具吗?我认为他们有一些工具 https://developers.google.com/web/updates/2017/04/devtools-release-notes

    【讨论】:

      【解决方案2】:
      1. 要调试性能问题,请使用profiler。它将帮助您识别花费最多时间的代码部分,因此您可以尝试改进它们。大多数浏览器在开发者工具中都有一个内置的分析器。

      2. 您的代码中有很多循环,请尝试找到避免它们的方法。特别是,您经常调用findDivisors(),并且它必须在大范围内循环。如果您重复调用相同的号码,memoization 可以避免大部分情况。

      【讨论】:

        【解决方案3】:

        最快的循环方式是旧的丑陋for循环。实际上,while循环可以比for循环更快。 您可以在此讨论中查看有关循环性能的更多信息What's the fastest way to loop through an array in JavaScript?

        让它更快的诀窍是减少循环的数量。对 map、reduce、filter 的每次调用,并且代码中有很多这样的调用只是 for 循环的更慢版本。

        • 4 个映射调用,1 个减少,2 个过滤器(总共 7 个循环)我的第一个赌注是减少循环次数。在 1 个循环周期上执行多个操作。

        只需从 findDivisor 中删除 range 调用和 .filter 并更新 find divisor 以使用 for (let i = 1; i

        【讨论】:

          猜你喜欢
          • 2012-10-22
          • 2020-06-20
          • 2013-06-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多