XSLT と XQuery プロファイラー

www.altova.com このトピックを印刷 前のページ 1つ上のレベル 次のページ

ホーム >  ユーザーマニュアル > XSLT/XQuery デバッガー とプロファイラー >

XSLT と XQuery プロファイラー

Altova ウェブサイトAltovaWebLink XSLT プロファイラーXQuery プロファイラー

 

XSLT/XQuery プロファイラーを利用することで、XMLSpy 内部から XSLT(1.0 ならびに 2.0)スタイルシートや XQuery ドキュメントの実行時間を分析することができます。XSLT スタイルシートや XQuery ドキュメントにある各命令の実行に必要な時間が表示され、これらファイルの実行時間を最適化するための材料として使うことができます。

 

プロファイラーを使用することで、実行時間が最も長い命令を発見し、全体の最適化を行うことができます。

命令の合計実行時間が長くなる原因として、以下の2つが考えられます。

 

長い実行時間を必要とする命令である
命令の呼び出し回数が高い(高いヒットカウント)

 

ヒットカウントとコールグラフプロファイリング

プロファイラーではヒットカウントコールグラフプロファイリングからの選択を行うことができます。各命令の実行結果の表は両方のプロファイリングで表示されます。

最適化の為には、各命令を1行で表示するヒットカウントプロファイリングが通常使用されます。

コールグラフプロファイリングでは XSLT 変換または XQuery 実行全体の履歴が表示され、例えば変換において呼び出されたテンプレートや関数が表示されます。コールグラフプロファイリングでは、命令毎に1行使用するのではなく、命令の呼び出し毎の表示が行われます。

 

XSLT/XQuery プロファイラーを使用するには、XSLT プロファイリングXQuery プロファイリングを参照ください。

 

プロファイラービュー

分析の結果は、タブにより切り替えることのできる以下のビューのどれかで確認することができます:

 

リスト表示:プロファイリングの結果がリスト形式で表示され、例えば命令の実行に要した経過時間により並べ替えを行うことができます。

profiler_xslt_listonly

 

ツリー表示:結果がツリー構造に似た形式で表示されます。例えば関数の実行に要した時間を確認し、その関数のツリーを展開して、関数内にある各命令が実行に要した時間と実行回数を参照することができます。

profiler_xslt_treeonly

 

結果の並び替え

プロファイリングを行った後、各命令が実行に要した時間や、各命令が呼び出された回数により並べ替えを行うことができます。

 

プロファイラー内の情報を並べ替えるには:

 

1.「リスト」 タブをクリックします。
2.並べ替えを行ないたい列のヘッダーをクリックします。例えば呼び出し回数では、命令が呼び出された回数で、経過時間では実行に要した時間により並べ替えが行われます。

 

このスクリーンショットでは命令の経過時間を降順で並べ替えた結果を示します。

 profiler_xslt_sorted

 

XSLT スタイルシートと XQuery ドキュメントの最適化

XSLT スタイルシートならびに XQuery ドキュメントにある命令の最適化を行う際には、以下の点に注意してください:

 

変数が1度だけしか使用されないのであれば、命令内での変数の使用を避ける(変数の宣言には時間がかかるため)。

 

以下の2つの XSLT コードフラグメントにて、必要ない変数を削除することでコードの最適化を図る例を示します。両者は同じことを行っていますが、2つめの例では変数 namecontainsResult を使用すること無く同じ処理を行っています:

 

コードフラグメント1:

 <xsl:for-each select="row">

         <xsl:variable name="row" select="."/>

         <xsl:for-each select="@name">

                 <xsl:variable name="name" select="."/>

                 <xsl:variable name="containsResult" select="fn:contains($name, '.exe')"/>

                 <xsl:if test="string($containsResult)='true'">

                 

                 ...                

         

                 </xsl:if>

         </xsl:for-each>

 </xsl:for-each>                                                                                

 

以下のスクリーンショットでは、このコードフラグメントを含むファイルの分析結果を命令の長さにより並べ替えた結果を示しています。変数 containsResult が初期化するための命令に、合計で 19 秒の実行時間が必要になっています。

profiler_optimize_before

以下のスクリーンショットでは分析結果がツリー表示で示されています。ここでは、変数 containsResult を使用する IF ステートメントの実行に合計で約 50 秒かかることが確認できます:

profiler_optimize_before_tree

XSLT 変換には合計で約74秒必要なことが確認できます:

profiler_optimize_totaltime1

コードフラグメント2:
<xsl:for-each select="row">
       <xsl:variable name="row" select="."/>
       <xsl:for-each select="@name">
               <xsl:if test="fn:contains(., '.exe')">
 
               ...
 
               </xsl:if>
       </xsl:for-each>
</xsl:for-each>

 

 

これらの変数を使用すること無くスタイルシートを書き直すと、合計実行時間は約 4.3 秒まで短縮できることが確認できます。

 

profiler_optimize_totaltime2

値や条件式が繰り返し使用される場合には変数を使用する。
関数内ではローカル定数の作成を避ける。代わりにグローバル変数を使用する。
関数内では静的なツリーフラグメントの作成を避ける。代わりにグローバルで作成する。
かっこを使ったフィルタリングの評価は各ノードに対して行われるため、かっこの使用を制限する。例えば、名前を使ったフィルタリングを行うことで、かっこの使用数を減らすことができます。以下の例では、* は2つのかっこと共に使用されています:

 

//*[node-name()=Book][author="Steve"]

 

等価の処理を行う以下のステートメントでは、Book という名前と1つのかっこが使用されています:

 

//Book[@Author="Steve"]

 

1度しか実行されなくても良い命令は1度しか呼び出されないように命令を分割する。グローバルな文脈でしか使用されない部分からは、グローバル変数を作成します。

 


(C) 2019 Altova GmbH