19
One Time Binding & Digest Loop @konpyu ng-japan 2015/03/21

One Time Binding & Digest Loop

Embed Size (px)

Citation preview

Page 1: One Time Binding & Digest Loop

One Time Binding & Digest Loop

@konpyu ng-japan 2015/03/21

Page 2: One Time Binding & Digest Loop

• KON Yuichi (@konpyu)

• Software Engineer in peace of cake

• note.mu : build with angular

自己紹介

Page 3: One Time Binding & Digest Loop

Performance Issue

• $scopeに大量のデータを突っ込んでいませんか?

• 1回のdigest loopで比較する要素数が増えてしまう

• $scopeに紐づく要素数が2kを超えたあたりからパフォーマンスが劣化(目安)

Page 4: One Time Binding & Digest Loop

Let’s Count $$watcher

Page 5: One Time Binding & Digest Loop

Let’s Count $$watcher

• まずは、自分のアプリの$scopeにどれくらい$$watcher

がいるかチェックしてみる

• $scope.$$watcherの総数を数える

• note.muでは…

Page 6: One Time Binding & Digest Loop

Let’s Count $$watcher

Page 7: One Time Binding & Digest Loop

Let’s Count $$watcher

• 注: $compile.debugInfoEnabled(false)している場合は、consoleからangular.reloadWithDebugInfo()を叩いてreload

し、デバッグ情報を付与した状態にしておく

Page 8: One Time Binding & Digest Loop

One Time Binding

• 最初の1回しかbindingしない

• 2回目以降はdigest loopの対象から外れる

• 値が変わる必要がないデータに適応するとよい

• 1.3から導入. 1.2ではbindonceで同様の事が出来る(kibanaでも採用)

Page 9: One Time Binding & Digest Loop

基本形

• bind対象のまえに :: をつけます

Page 10: One Time Binding & Digest Loop

論理積・和

• : :is_hoge && : :is_fuga ではない

• 全体を()でくくって、そのまえに: :

Page 11: One Time Binding & Digest Loop

ng-class

• { ‘selected’: ::is_selected } ではない

• { }の前に、 : : をつける

Page 12: One Time Binding & Digest Loop

くわしくはQiitaで

• よくある例をまとめときました

• One Time Bindingがデフォルトになってるモードがほしい

http://qiita.com/konpyu/items/6a29592e45e2340cc34f

Page 13: One Time Binding & Digest Loop

Next, Let’s count digest loop

• digest loopを必要以上に発生させない

• 少なくとも、どのタイミングでdigest loopが発生してしまうかは把握して実装するとよい

• digest loopの発生回数をカウントしてみましょう

Page 14: One Time Binding & Digest Loop

Timing of starting digest loop

•$http $resourceのレスポンス受信時 •locationの変更時 •$timeoutのtick時 •DOMイベント(ng-click, ng-keydown etc)

Page 15: One Time Binding & Digest Loop

Let’s count digest loop

• digest loopが走る際に、$watch内の関数が評価される

•このタイミングでカウントアップすればよい

• note.muでは…

Page 16: One Time Binding & Digest Loop

Let’s count digest loop

Page 17: One Time Binding & Digest Loop

Let’s count digest loop

• データの更新が必要ないなら、digest loopを回さなくてよい

• $timeoutの第三引数にfalseを指定

• なるべくAPIを呼ぶ回数を減らす(まとめる)

• web workerに逃がす (https://www.youtube.com/watch?v=lceLw8ROUP8)

Page 18: One Time Binding & Digest Loop

レスポンスを握りつぶせるAjaxは$httpを避ける

•$http, $resourceではレスポンスが返ってくると

digest loopが走ってしまう

•返り値が必要ない場合はjQueryでAjaxしている

•行動の記録系のAPIとか

•Angular wayでAPI call後のdigestを避ける方法をご存

知でしたらそっと教えて下さい

Page 19: One Time Binding & Digest Loop

まとめ・まずは、あなたのサービスのwatcherの数、digest loopの数をチェックしてみてください !

・digest loopの回数 × 1周にかかる時間 を減らそう !

・one time bindingが有効です !

・digest loopが起こる場所を把握して、場合によってはangular way以外の選択肢を考えるのもあり !注)これらは全て1系のAngularについての話です