5章 テンプレート
7. テンプレート・プロファイラ
テンプレート・プロファイラは、テンプレートの性能改善を行う場合に必要になる情報を収集記録するためのツールです。
WebRelease を使い続けていると次第にサイトのページ数も増え、FTP時間が徐々に長くなり、もう少しFTP時間を短縮できないかを検討しなければならなくなる場合があります。そのような時にはテンプレート・プロファイラを使うと良いでしょう。テンプレート・プロファイラを使えば、テンプレートの展開やメソッドのどの処理でどの程度の時間を費やしているのかを調べることができるので、実測値に基づいた効率的なテンプレートチューニングが可能になります。
テンプレート・プロファイラを起動する
テンプレート・プロファイラは FTP 実行中に動作します。テンプレート一覧画面の「プロファイル」タブにある「次回 FTP 時に計測実施」というチェックボックスを ON にした状態で FTP を実行すると、その FTP 中にテンプレート・プロファイラが動作して、各種の情報を収集します。(このチェックボックスを ON するだけで OK です。保存ボタンはありません)
テンプレート・プロファイラを ON にした状態で FTP を実行すると、FTP時間(コンテンツ生成時間)が少し長くなります。状況によりますが、FTP時間が 30 % 程度長くなる場合があります。テンプレートプロファイラを使うのはテンプレート開発やチューニングの作業中だけにして、実運用の状況ではテンプレートプロファイラは OFF にしておく方が良いでしょう。
プロファイル結果の見方
プロファイル結果の見方を例を使って説明します。このスナップショットは、あるサイトでテンプレート・プロファイラを使ってプロファイルを取得した結果です。プロファイルが実行された状態では、プロファイル画面にはこのようにプロファイル結果が表示されます。
図中、オレンジ色の枠で囲まれている行は、コンテンツ生成処理中にもっとも時間を消費したメソッドに関する情報です。このケースでは、MethodLibrary というコンポーネントに定義されている getDocumentDate() というメソッドが最も時間のかかったメソッドであったことが示されています。このメソッドはトータルで 1,303.6 ミリ秒の時間を消費しました。呼ばれた回数は 92,888 回でした。このメソッドの一回あたりの平均実行時間は 14.0 マイクロ秒でした。
図中、青い枠で囲まれている部分が、件のメソッドがどこから呼ばれたのかを示す情報です。一番上の行は、セミナーというテンプレートの getDocumetnDate() というメソッドから 、チャネル main 用のコンテンツの生成のために 29,711回呼び出され、その呼び出しで 486.0 ミリ秒の時間を消費したことを示しています。続く2行めは、同じくセミナーというテンプレートの getDocumetnDate() というメソッドから 、チャネル mobile 用のコンテンツの生成のために 28,863回呼び出され、その呼び出しで 384.5 ミリ秒の時間を消費したことを示しています。
このケースでは、2番めに時間を消費していたメソッドは、WebRelease の組み込み関数 replaceAll() でした。replaceAll() 関数はトータルで 1,109.4 ミリ秒を消費しました。呼ばれた回数は 54,201 回でした。
青枠内の「呼出回数」欄の値の合計はオレンジ枠内の「呼出回数」の値になります。また、青枠内の「消費時間」欄の値の合計はオレンジ枠内の「消費時間」の値にほぼ一致します。
プロファイル結果の各欄に表示される値は下記のとおりです。
ランク
対象が、何番目に時間を消費したかを示すランキングです。この欄に値のある行は、呼び出された対象 (以下 callee) に関する情報を表しています。callee はメソッド、展開、WebRelease の組込み関数、オブジェクトのメソッドのいずれかの場合があります。この欄が空欄の行は、直前にある callee を呼び出した側 (以下 caller) の情報を表しています。
展開・メソッド・関数
この欄には callee の情報が表示されます。表示形式は callee により異なります。
- callee がメソッドの場合、メソッドの名前が表示されます。
- callee がテンプレートの展開の場合は「展開」と表示されます。
- callee が WebRelease の組み込み関数の場合、その関数名が表示されます。
- callee がオブジェクトのメソッドの場合、オブジェクト名.メソッド名() という表示になります。例えば Folder.pageWithFileNameRex() という形式で表示されます。
この欄は callee 行 (上図オレンジ枠部分) 以外では空欄になります。
呼出元メソッド・展開
callee を呼び出した caller の情報が表示されます。caller は、メソッドまたは展開の場合があります。caller がメソッドの場合はそのメソッド名が表示されます。caller が展開の場合は「展開」と表示されます。この欄は caller 行 (上図青枠部分) 以外では空欄になります。
テンプレート・コンポーネント
callee 行では callee が定義されているテンプレートまたはコンポーネントの名前が表示されます。callee がオブジェクトのメソッドまたは WebRelease の組み込み関数の場合は System と表示されます。
caller 行では caller が定義されているテンプレートまたはコンポーネントの名前が表示されます。caller が展開の場合は「展開」と表示されます。
チャネル
どのチャネル向けのコンテンツを生成しているときに callee を呼び出したのかを示すチャネル名が表示されます。この欄は caller 行以外では空欄になります。
消費時間(m sec)
callee 行では callee が消費した時間が表示されます。この時間は、その callee が自分で消費した時間だけが含まれています。callee が他のメソッドや関数を呼び出していても、それらの呼び出し先で消費された時間はこの欄の時間には含まれていません。
caller 行では callee の消費時間の caller 別の内訳が表示されます。
この欄の値には FTP によるファイル転送にかかった時間は含まれていません。値は、実際にそのメソッドの実行にかかった時間です。この時間は CPU 時間ではなく、メソッドに入ってから出てくるまでの実時間です。
この欄の時間の解釈には注意が必要です。例えば 8 コアの CPU を使って FTP を実行した結果、1 分で FTP が終わったとします。この場合 CPU はトータルで 8 分間の処理を行なったことになります。換言すると、同じ FTP の処理を 1 コアの CPU で行なった場合 8 分の時間がかかることになるということです。この欄の時間は、実際に FTP が何個のコアを使って実行されたかにかかわらず「もし 1 個のコアで実行したならば」という条件での値が表示されています。すべての callee 行の、この欄の値の合計は、FTP 所要時間のおおよそコア数倍の時間になります。
なお、プロファイル画面の上部に表示されている「コア数」という欄の値が、そのプロファイルを計測した時に実行された FTP が実際に使用されていたコアの数です。
この欄の値は、多少誤差がありますので、計測ごとに多少ばらつきのある値になります。時間の値は大体の目安として捉えてください。
呼出回数
callee 行では、callee が呼び出された回数が表示されます。caller 行ではその caller が callee を呼び出した回数が表示されます。
消費時間/回(μ sec)
参考値として callee の1回あたりの平均の消費時間が表示されます。
テンプレート・プロファイラは、あるメソッドが実際にどこから呼び出されているのかを調べるためにも使うことができますが、得られる結果は、プロファイルを取得した時点のコンテンツデータに依存していることに注意してください。
あるプロファイル結果で、あるメソッド、ここでは例えば a() というメソッドが、まったく呼び出されなかったとしても、それが、メソッド a() の呼び出し元がどこにも存在しないということを示しているわけではありません。
その時のコンテンツデータで、たまたま、メソッド a() の呼び出しが起こらなかっただけかもしれず、他のコンテンツデータでは、メソッド a() が呼び出される可能性が残されています。
メソッド a() をメンテナンスする場合の影響範囲を考える上で、テンプレート・プロファイラの結果は参考にはなりますが、何らかの保証を与える物ではないことにご注意ください。
プロファイル結果のダウンロード
プロファイル結果は,、画面右上の「ダウンロード」ボタンをクリックすることでダウンロード可能です。テンプレートのチューニングを行う場合には、あるテンプレートでのプロファイル結果がどうだったのか、ダウンロードして保管し、後で比較できるようにしておくと良いでしょう。
チューニングの考え方
テンプレートのチューニングを行う場合は、処理時間の長いメソッドからチューニングするのが良いでしょう。呼び出し回数の少ない、処理時間も短いメソッドを高速化しても成果が得られません。可能な限り、プロファイル結果のランキング上位のメソッドから着手すると良いでしょう。