anglejsダイジェストサイクルの期間を測定する簡単な方法は何ですか?ダイジェストサイクルのパフォーマンスを分析するにはさまざまな方法がありますが、それぞれに独自の落とし穴があります。
- Chromeプロファイラー:詳細が多すぎて、ダイジェストサイクルを見つけやすい方法で分解しません
- Batarang(AngularJSブラウザープラグイン):オーバーヘッドが多すぎ、リフレッシュレートが遅く、大きなアプリで爆発します。
...もっと良い方法があるはずですか?!1?
回答:
ここに秘密があります。Chrome開発ツールで、CPUプロファイルを実行します。キャプチャを停止すると、画面の下部にある[重い(下から上)]の横に下向きの三角形が表示されます。三角形をクリックして、「炎チャート」を選択します。フレームチャートモードになったら、ズームとパンを行って、ダイジェストサイクル、所要時間、および呼び出されている関数を正確に確認できます。Flame Chartは、ページの読み込みの問題、ng-repeatのパフォーマンスの問題、ダイジェストサイクルの問題を追跡するのに非常に役立ちます。Flame Chartの前に、どのようにしてデバッグとプロファイリングを行うことができたのか、本当にわかりません。次に例を示します。
次の回答は、$ digestループのアイドルパフォーマンス、つまり、ウォッチ式が変更されていない場合のダイジェストのパフォーマンスを示しています。これは、ビューが変更されていない場合でもアプリケーションが遅いように見える場合に役立ちます。より複雑な状況については、aetの回答を参照してください。
コンソールに次のように入力します。
angular.element(document).injector().invoke(function($rootScope) {
var a = performance.now();
$rootScope.$apply();
console.log(performance.now()-a);
})
結果は、ミリ秒単位でダイジェストサイクルの期間を示します。数値が小さいほど良いです。
注意:
コメントで指摘されたドミ: 初期化にディレクティブを
angular.element(document)
使用した場合、あまり成果はありませんng-app
。その場合は、ng-app
代わりに要素を取得してください。例:angular.element('#ng-app')
次のことも試すことができます。
angular.element(document.querySelector('[ng-app]')).injector().invoke(function($rootScope) {
var a = performance.now();
$rootScope.$apply();
console.log(performance.now()-a);
})
The listener is called only when the value from the current watchExpression and the previous call to watchExpression are not equal
。あなたのコードはリスナーを考慮に入れていません。そしてangularは多くのリスナーを生み出します。$apply()
何も変わっていないときは電話をかけないので、結果は話の半分しか伝えません。状況によっては、あまり面白くないかもしれません;)
angular.element(document)
ng-app
初期化にディレクティブを使用した場合、多くは得られません。その場合は、ng-app
代わりに要素を取得してください。例:angular.element('#ng-app')
...
角度パフォーマンスを使用することもできます
この拡張機能は、ウォッチャーの数、ダイジェストのタイミング、およびダイジェスト率のリアルタイムの監視チャートを提供します。また、ダイジェストタイミングの分布を取得して、より再帰的なパターンから非常に長いダイジェストタイミングを把握し、すべてのリアルタイムデータをイベントにリンクして、アプリケーションのパフォーマンスを変更したアクションを特定できるようにします。最後に、サービスメソッドの時間を計測し、その実行をカウントして、アプリの実行時間により大きな影響を与えるものを特定できます。
免責事項:私は拡張機能の作成者です
ダイジェストサイクルを監視するための便利なツールの1つは、@ kentcdoddsによる優れたng-statsツールを介して見つけることができます。それはそのような小さな視覚的要素を作成し、ブックマークレットを介して実装することもできます。jsfiddleのようなiFrame内でも使用できます。
ページの角度ダイジェスト/ウォッチに関する統計を表示するユーティリティはほとんどありません。このライブラリには現在、チャートを作成するための簡単なスクリプトがあります(以下を参照)。また 、指定したページの特定の場所に角度統計を配置するために使用できる
angularStats
というディレクティブを持つというモジュールも作成しangular-stats
ます。
UXプロファイラーを使用できます
上記のツールは、ダイジェストループのパフォーマンスを測定するというアイデアをすでに提供しています。ダイジェストサイクルのパフォーマンスを向上させるための最も重要なポイントは次のとおりです。
スクロールイベントを注意深く監視して、すべての非表示要素を非表示にし
、ウォッチャーの数を大幅に減らします。
他のすべてのイベントに対して管理可能な$ digestサイクルを用意します。