2014/05/22

User Timing APIを使ってWebアプリケーションの性能を測定する

Webアプリを作っていてチューニングしたいんだけど性能測定が難しかった。
ChromeのProfileを使ったり、console.timeを使ったりしてみたけど、User Timing APIという便利なAPIがあるらしいのでそれを使ってみた。

■環境
Chrome 35.0.1916.99 beta
※サポート外のブラウザで動作させたい場合のPolyfill(機能差分を埋めてくれるライブラリ)が公開されているのでそれを使うと良いそう。

■参考
User Timing API あなたの Web アプリをもっと理解するために

■仕込み
性能測定に使う主なメソッドは以下だけ。
window.performance.mark(...)
測定したいポイントにこのマークを設置する。 例えば、
window.performance.mark('load_file_start');
...
window.performance.mark('analyze_file_start');
...
window.performance.mark('load_file_end');
...
window.performance.mark('analyze_file_end')
のようにmarkをどんどん設置していく。

■測定
マーク間の時間を測定したい場合にmeasureメソッドを使う。
window.performance.measure('load_file', 'load_file_start', 'load_file_end');
第一引数は測定値に対する名前なので分かりやすい名前を付ける。
第二引数は測定の開始点のマーク名。
第三引数は終点のマーク名。
測定値はwindow.performanceが保持しているので、値の取得は
var items = window.performance.getEntriesByName('load_file');
などとする。
ByNameの他にByTypeなどもある。
実際の数値の出力は
for ( var i = 0; i  < items.length(); i++ )
  console.log( items[i].name + ':' + items[i].duration + ' ms' );
などとする。

■ちょっと便利なマーク値
User Timing APIが便利なのは事前に幾つかマークが仕込まれていること。
例えば、
HTMLの読込を開始する時は'fetchStart'
DOMの読込が完了した時は'domComplete'
完全にHTMLの読込・解析が完了した時は'loadEventEnd'
など。
全内容はコチラを参照→W3C Navigation Timing 
ユーザがJSで仕込める以外の部分にもマークが仕込まれているのが便利。

DOMの読込が完了してからHTMLの全ロードが完了するまでの時間を測定したい場合は。
window.performance.measure('afer_dom', 'domComplete', 'loadEventEnd');
とすればマークを何も設置せずに測定できる。
便利!