2017-06-15 2 views
0

私はlulzのCodeWarsチャレンジを達成しようとしていますが、提出物を渡すのに十分なパフォーマンスを得ることができません。解決策は正しく、すべてのテストに合格したが、それは、性能試験を失敗し、服用> 120000ミリ秒nonperformant javascriptコードを最適化/デバッグする方法

YOU FOR MY 2つの質問

  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

あなたがにコードを平手打ちすることができるはずWebサイト上のウィンドウを開き、渡された入力と失敗のタイマーテストを再作成します。

答えて

0
  1. のいくつかの種類があると思うクロム59の新しいツールをチェックしています。これは、最も時間を費やしているコードの部分を特定するのに役立ちます。したがって、コードを改善することができます。ほとんどのブラウザには、開発者ツールに組み込まれたプロファイラがあります。

  2. あなたのコードにはたくさんのループがありますが、回避する方法を見つけようとします。特に、findDivisors()を頻繁に呼び出しているため、大きな範囲でループする必要があります。同じ番号に対して繰り返し呼び出す場合は、memoizationがそれを避けることができます。ループの

0

最速の方法は、ループの古い醜いです。実際には、ループがwhileループの方が速い場合もあります。 このディスカッションでは、ループパフォーマンスの詳細を確認できますWhat's the fastest way to loop through an array in JavaScript?

トリックはループ回数を減らすことです。 map、reduce、filterへのすべての呼び出しは、あなたのコードでこれらの呼び出しがたくさんありますが、forループのほんの少し遅いバージョンです。

  • 4 map calls、1 reduce、2 filter(total 7 looping)私の最初の賭けはループ回数を減らすことです。 1ループサイクルで複数の操作を実行します。
あなただけのために使用する範囲のコールと.filter findDivisorから、更新検索除数を除去することにより、利益の多くを見る必要があり

(聞かせてI = 1; I < = X;私は++)

関連する問題