最近、パフォーマンスを分析するためにBatarangプラグインをいじっています。すべてのログの上部に、regularInterceptedExpression と呼ばれるもの専用のセクションがあることに気付きました。これが何を意味するのか、パフォーマンスを向上させる方法を誰かが説明できますか? ディレクティブで「=」プロパティを使用したことが原因である可能性がある場所を読みました。他の誰かがこれを見た場合、解決策はありますか?
1 に答える
AngularJS コードを掘り下げると、 functionregularInterceptedExpression(scope, locals, assign, inputs)
内で定義された関数が表示されますaddInterceptor(parsedExpression, interceptorFn)
。addInterceptor(parsedExpression, interceptorFn)
functionが使用される唯一の場所は function$parse(exp, interceptorFn, expensiveChecks)
です。これは、String およびその他のウォッチが関数に変換される場所です。angular.js
ファイルを次のように更新する必要があります
$parse(exp, interceptorFn, expensiveChecks)
1)解析のソースを保持する機能を強化します。
$$source
関数の最初の引数にを設定して、メソッドの終わりと各スイッチケースの終わりの更新を見つけaddInterceptor
ます。
parsedExpression.$$source = exp; // keep the source expression handy
return addInterceptor(parsedExpression, interceptorFn);
case 'function':
exp.$$source = exp; // keep the source expression handy
return addInterceptor(exp, interceptorFn);
default:
noop.$$source = exp; // keep the source expression handy
return addInterceptor(noop, interceptorFn);
2) 関数内で、regularInterceptedExpression
その関数への呼び出しの統計を収集します。
var fn = regularWatch ? function regularInterceptedExpression(scope, locals, assign, inputs) {
var value = useInputs && inputs ? inputs[0] : parsedExpression(scope, locals, assign, inputs);
window.$$rieStats = window.$$rieStats || {};
window.$$rieStats[parsedExpression.$$source] = (window.$$rieStats[parsedExpression.$$source] ? window.$$rieStats[parsedExpression.$$source] : 0) + 1;
return interceptorFn(value, scope, locals);
3) アプリケーションを実行して統計を調べます。つまり、開発ツールを開いて$$rieStats
JavaScript コンソールに書き込みます。関数によって呼び出されるウォッチャーの数が表示されregularInterceptedExpression
ます。
Object.keys($$rieStats).sort(function(a,b){return $$rieStats[a]-$$rieStats[b]}).reverse().forEach(function(item){ console.log(item, $$rieStats[item])})
ヒント:$$rieStats
カウントを他の分岐関数oneTimeInterceptedExpression
に追加して、1 回限りのバインドも追跡することができます。