如何优化/调试性能不佳的javascript代码
我正试图为lulz完成一个CodeWars挑战,但我似乎无法让它达到足够的性能以通过提交。该解决方案是正确的,并通过了所有测试,但性能测试失败,耗时>120000毫秒 我想问你的两个问题如何优化/调试性能不佳的javascript代码,javascript,performance,optimization,Javascript,Performance,Optimization,我正试图为lulz完成一个CodeWars挑战,但我似乎无法让它达到足够的性能以通过提交。该解决方案是正确的,并通过了所有测试,但性能测试失败,耗时>120000毫秒 我想问你的两个问题 如何调试性能问题?我不知道如何开始调试性能和识别不良代码,或者如何有意地优化代码 这个特定代码有什么问题?是否存在我执行错误的模式?代码的某些部分是否发生了太多次 详细要求可在此处找到: ``` 详细要求可在此处找到: 您应该能够将代码插入他们网站上的窗口,并重新创建通过的输入和失败的计时器测试 你有没有检查
您应该能够将代码插入他们网站上的窗口,并重新创建通过的输入和失败的计时器测试 你有没有检查chrome 59上的新工具?我想他们有一些工具
findDivisors()
,它必须在很大范围内循环。如果你为了同一个号码反复打电话,你可以避免很多最快的循环方式是旧的丑陋的for循环。事实上,它的接缝,而循环可以更快地比为循环。 在本讨论中,您可以查看有关循环性能的更多信息 使其更快的诀窍是减少循环的数量。对map、reduce和filter的每次调用,代码中都有很多这样的调用,它们只是for循环的更好、更慢的版本
- 4个地图呼叫,1个减少,2个过滤器(总共7个循环)我的第一个赌注是减少循环次数。在一个循环周期内执行多个操作李>
//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