クライアントサイド JavaScript のパフォーマンス改善には backburner.js が便利!
DOM 処理や Ajax など、JavaScript が外の世界とやり取りする部分というのは、一般的に待ち時間を多く必要とします。
パフォーマンスを改善しようと思った時に、ロジック部分でコツコツと節約するより、まずコストが高い処理を行わないようにするということで、驚くほどの効果を経験をされたことはありませんか?
今までパフォーマンス測定をされた方であればピンとくる部分があることと思います。
そんな時に役に立つのが、今回ご紹介する backburner.js です。
backburner.js って?
backburner.js とは Ember.js の run loop モジュールから切りだされたとても小さなライブラリで、短時間に集中的に発生するメソッド呼び出しの回数を制限したい場合などに利用することができます。
backburner.js ってどう使うの?
例えば、JavaScript で特定のイベントハンドラ内で Ajax 通信を行う場合を考えてみましょう。
$('.action-area').on('mousemove', function(event) { // マウス位置を Ajax で送信 });
この例だと、.action-area
要素の上でマウスが動く度にマウス位置を Ajax で送信することになります。WebSocket でやり取りをしている場合でも無い限り、ここまで頻繁に通信を行うことはサーバにとって余分なコストとなる場合があります。
そこで backburner.js です。 上の例を以下のように書きなおしてみましょう。
var backburner = new Backburner(['send']); function sendMousePoint() { var event = this; // マウス位置を Ajax で送信... }; var wait = 100; $('.handle-area').on('mousemove', function(event) { backburner.debounce(event, sendMousePoint, wait); });
backburner.debounce
を使うことで、引数で指定されたメソッドは、同一の Function であれば一定の時間間隔(wait = 100 ms)の中で 1回しか実行されません。
とてもエコロジーですね。
また、いわゆる MVC フレームワークにおいて、モデルの変更をビューがバインドしていて、かつモデルに頻繁に更新が発生するといった場合についても応用出来ます。
これについては、 backburner.js の README に素晴らしくわかりやすいサンプルコードがあるので、こちらを見てみましょう。
モデルのプロパティをひとつひとつ変更していく、というのはよくありえるシチュエーションだと思います。
上述の例のように backburner.js を使うことで、チラツキやもっさり感の原因になりえる DOM の頻繁な更新を抑制することができます。
参考資料
もっと知りたくなった方は、作者の ebryn さんの発表動画とその資料をみてみると良いかもしれません。
- http://talks.erikbryn.com/backburner-and-the-run-loop/
- http://www.youtube.com/watch?v=VuIFdXmi080&feature=youtu.be&t=24m5s
それでは、みなさまも backburner.js のすばらしさをご体感くださいませ!