このページの本文へ

Navigation Timing APIでサイトパフォーマンスを調査 (2/4)

2012年03月02日 14時57分更新

文●古籏一浩

  • この記事をはてなブックマークに追加
本文印刷

読み込み時間を計測する

 Navigation Timing APIにはメソッドはありません。計測時間を示すプロパティだけがあり、各プロパティに対応する時間がミリ秒で格納されます。

 読み込みタイミングとプロパティ名の対応を以下の図に示します。図は上から順番に処理されていきます。

【図】fig2.png

読み込みタイミングとプロパティ名

 Webページは検索エンジンなどを経由して表示される場合もあれば、ブラウザーをリロードして表示される場合もあります。Navigation Timing APIにはページがどのように呼び出されたかを知るためのプロパティも用意されています。


performance.navigation.type

 performance.navigation.typeの値は0, 1, 2, 255のいずれかになります。255は将来、何かの意味を持たせるために予約してあるだけですので、実際に返される値は0,1,2です。これらの値の意味は以下のようになります。

0 TYPE_NVIGATE クリックされたかURLを入力してページに移動してきた
1 TYPE_RELOAD リロードしてページを表示した
2 TYPE_BACK_FORWARD ブラウザーの「進む」「戻る」ボタンでページ移動した

 実際にperformance.navigation.typeを利用したプログラムがサンプル1です。実行すると、どのようにしてページにアクセスしたかが表示されます。

【図】fig3.png

新規にページにアクセスした場合

【図】fig4.png

ページをリロードした場合

サンプル1


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Navigation Type結果</title>
  </head>
  <body>
  <h1>Navigation Type結果</h1>
  <form>
    <input type="button" id="btn" value="結果表示">
  </form>
  <output id="result"></output>
  <script>
    document.getElementById("btn").onclick = function(){
      var msg = ["クリックかURL入力", "リロードしました", "ヒストリーを利用"];
      var type = performance.navigation.type;  // 種類
      document.getElementById("result").innerHTML = msg[type];
    }
  </script>
  </body>
</html>

 次に、ページの読み込みにかかった時間を計測して表示してみましょう。ページ全体の処理にかかる時間は、domCompleteの値からnavigationStartの値を引くと求められます。なお、ページが読み込まれた後に発生するloadイベントで何らかの処理をしている場合は、domCompleteでなくloadEventEndの値からnavigationStartの値を引いてください。

 サンプル2が実際のプログラムです。ボタンをクリックするとページの読み込み、表示にかかった時間がミリ秒で表示されます。

【図】fig5.png

Google Chromeでの結果

【図】fig6.png

Firefoxでの結果

サンプル2


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Navigation Timing計測結果</title>
  </head>
  <body>
  <h1>Navigation Timing計測結果</h1>
  <form>
    <input type="button" id="btn" value="結果表示">
  </form>
  <output id="result"></output>
  <script>
    document.getElementById("btn").onclick = function(){
      var startTime = performance.timing.navigationStart;
      var endTime = performance.timing.domComplete;
      var text = (endTime - startTime)+"ミリ秒<br>";
      document.getElementById("result").innerHTML = text;
    }
  </script>
  </body>
</html>

すべてのタイミングを表示

 前の図に示したように、Navigation Timing APIにはさまざまなプロパティがあります。

 サンプル2では計測結果が問題なく表示できましたが、セキュアな接続時に計測されるsecureConnectionStartのように、その処理が発生しない場合は計測時間が格納されないことがあります(ブラウザーによって動作が違うようです)。実際に計測結果を示すには、値が格納されていない場合も考慮する必要があります。

 サンプル3はunloadEventStartとunloadEventEnd以外、すべての計測結果を表示します。値が計測されない場合は横棒を表示します。

【図】fig7.png

Google Chromeでの計測結果

サンプル3


<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Navigation Timing計測結果</title>
  </head>
  <body>
  <h1>Navigation Timing計測結果</h1>
  <form>
    <input type="button" id="btn" value="結果表示">
  </form>
  <output id="result"></output>
  <script>
    document.getElementById("btn").onclick = function(){
      var now = (new Date()).getTime();
      var param = [
        "navigationStart", "unloadEventStart", "unloadEventEnd", "redirectStart",
        "redirectEnd", "fetchStart", "domainLookupStart", "domainLookupEnd",
        "connectStart", "connectEnd", "secureConnectionStart", "requestStart",
        "responseStart", "responseEnd", "domLoading", "domInteractive",
        "domContentLoaded", "domComplete", "loadEventStart", "loadEventEnd"
      ];
      var startTime = performance.timing.navigationStart;
      var text = "";
      for(var i=0; i<param= 0){
          text += param[i]+" : "+(measureTime - startTime)+"ミリ秒<br>";
        }else{
          text += param[i]+" : ━━━<br>";
        }
      }
      document.getElementById("result").innerHTML = text;
    }
  </script>
  <!-- 時間のかかる処理 -->
  <script>
    for(var i=0; i<10000; i++){
      document.write("<table border=1><tr><th>"+i+"</th><td>"+i*2+"</td></tr></table>");
    }
  </script>
  </body>
</html>

この連載の記事

一覧へ

この記事の編集者は以下の記事をオススメしています