Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/478.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何优化/调试性能不佳的javascript代码_Javascript_Performance_Optimization - Fatal编程技术网

如何优化/调试性能不佳的javascript代码

如何优化/调试性能不佳的javascript代码,javascript,performance,optimization,Javascript,Performance,Optimization,我正试图为lulz完成一个CodeWars挑战,但我似乎无法让它达到足够的性能以通过提交。该解决方案是正确的,并通过了所有测试,但性能测试失败,耗时>120000毫秒 我想问你的两个问题 如何调试性能问题?我不知道如何开始调试性能和识别不良代码,或者如何有意地优化代码 这个特定代码有什么问题?是否存在我执行错误的模式?代码的某些部分是否发生了太多次 详细要求可在此处找到: ``` 详细要求可在此处找到: 您应该能够将代码插入他们网站上的窗口,并重新创建通过的输入和失败的计时器测试 你有没有检查

我正试图为lulz完成一个CodeWars挑战,但我似乎无法让它达到足够的性能以通过提交。该解决方案是正确的,并通过了所有测试,但性能测试失败,耗时>120000毫秒

我想问你的两个问题

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

  • 这个特定代码有什么问题?是否存在我执行错误的模式?代码的某些部分是否发生了太多次

  • 详细要求可在此处找到: ```

    详细要求可在此处找到:


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

    你有没有检查chrome 59上的新工具?我想他们有一些工具

  • 要调试性能问题,请使用。它将帮助您识别代码中花费时间最多的部分,以便您可以尝试改进它们。大多数浏览器在开发人员工具中都有内置的探查器

  • 代码中有很多循环,请设法避免它们。特别是,您经常调用
    findDivisors()
    ,它必须在很大范围内循环。如果你为了同一个号码反复打电话,你可以避免很多


  • 最快的循环方式是旧的丑陋的for循环。事实上,它的接缝,而循环可以更快地比为循环。 在本讨论中,您可以查看有关循环性能的更多信息

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

    • 4个地图呼叫,1个减少,2个过滤器(总共7个循环)我的第一个赌注是减少循环次数。在一个循环周期内执行多个操作
    只要从findDivisor中删除范围调用和.filter并更新要用于(让i=1;i)的查找除数,您就会看到很多好处
    //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