2016-08-24 5 views
0

1.0互換のxsltファイルでXalanJ 2.7.1を使用します。私たちはSaxon-EE 9.7でxslt 2.0に変更したいので、これがより速く動作するならば、いくつかのフィージビリティスタディを行いたいと思っています。インターネットからの以前のすべての研究から、XalanJが最も遅いと言われています。バージョン変更だけでXSL 1.0からXSLT 2.0に変更

XalanJ平均時間での変換は989msですが、Saxon-EEではバージョンが1.0から2.0に変更され、同じxsltルールが1100msの平均で実行されます。

xsltファイルを書き直す必要があるか、パフォーマンス測定でエラーが発生する可能性がありますか? 変換を変更する必要がある場合、特に何ですか?

編集2:パフォーマンステストpourposesについては

我々だけtransfor方法のための時間を測定するためにGugleGuavaのストップウォッチを使用すると

final Stopwatch stopwatch = new Stopwatch(); 

TransformerFactory factory = new EnterpriseTransformerFactory(); 
Source xsl = new StreamSource(FileUtils.openInputStream(fileXSL), fileXSL.getAbsolutePath()); 
Transformer transformer = factory.newTransformer(xslt); 
stopwatch.start(); 
transformer.transform(input, output); 
stopwatch.stop(); 

を使用してサンプルアプリケーションを作成します。私は変換を1000回実行し、最初の100回の実行を無視して平均時間を測定します。

編集3: は合計時間:1816.153ミリ秒 私はサクソンプロファイラ

<table border="border" cellpadding="10"> 
 
    <thead> 
 
    <tr> 
 
     <th>file</th> 
 
     <th>line</th> 
 
     <th>instruction</th> 
 
     <th>count</th> 
 
     <th>average time (gross)</th> 
 
     <th>total time (gross)</th> 
 
     <th>average time (net)</th> 
 
     <th>total time (net)</th> 
 
    </tr> 
 
    </thead> 
 
    <tbody> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>234</td> 
 
     <td>template tplCreateAttribute</td> 
 
     <td align="right">5281262</td> 
 
     <td align="right">0.007</td> 
 
     <td align="right">36443.790</td> 
 
     <td align="right">0.007</td> 
 
     <td align="right">36443.790</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>248</td> 
 
     <td>template tplCreateDateAttribute</td> 
 
     <td align="right">1215364</td> 
 
     <td align="right">0.010</td> 
 
     <td align="right">11722.446</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">9177.567</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>265</td> 
 
     <td>template tplCreateBoolAttribute</td> 
 
     <td align="right">934716</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">7438.999</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">7438.999</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>392</td> 
 
     <td>template fnMathRandomNumber</td> 
 
     <td align="right">1215364</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">5937.933</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">5937.933</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>338</td> 
 
     <td>template tplCreateAttributeOBID</td> 
 
     <td align="right">607682</td> 
 
     <td align="right">0.018</td> 
 
     <td align="right">11004.523</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">5066.590</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>41</td> 
 
     <td>template dcx:object[@class = 'Object']</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">2.599</td> 
 
     <td align="right">809778.821</td> 
 
     <td align="right">0.014</td> 
 
     <td align="right">4316.423</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>318</td> 
 
     <td>template tplCreateAttributeWithDefault</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">0.011</td> 
 
     <td align="right">3500.819</td> 
 
     <td align="right">0.011</td> 
 
     <td align="right">3500.819</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>365</td> 
 
     <td>template tplCreateAttributeObjectState</td> 
 
     <td align="right">311572</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">2645.134</td> 
 
     <td align="right">0.008</td> 
 
     <td align="right">2645.134</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>376</td> 
 
     <td>template fnDateConvert</td> 
 
     <td align="right">592220</td> 
 
     <td align="right">0.004</td> 
 
     <td align="right">2544.879</td> 
 
     <td align="right">0.004</td> 
 
     <td align="right">2544.879</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>201</td> 
 
     <td>template dcx:object[@class = 'Object Smpl']</td> 
 
     <td align="right">296110</td> 
 
     <td align="right">2.530</td> 
 
     <td align="right">749090.244</td> 
 
     <td align="right">0.005</td> 
 
     <td align="right">1545.430</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>33</td> 
 
     <td>template /</td> 
 
     <td align="right">1</td> 
 
     <td align="right">78836.780</td> 
 
     <td align="right">78836.780</td> 
 
     <td align="right">219.216</td> 
 
     <td align="right">219.216</td> 
 
    </tr> 
 
    <tr> 
 
     <td>"*_transformation.xsl"</td> 
 
     <td>26</td> 
 
     <td>variable constAlphabetUpperCase</td> 
 
     <td align="right">2</td> 
 
     <td align="right">0.229</td> 
 
     <td align="right">0.458</td> 
 
     <td align="right">0.229</td> 
 
     <td align="right">0.458</td> 
 
    </tr> 
 
    </tbody> 
 
</table>

+2

SaxonのAPIとツリーモデルを使用するか、JAXPとおそらくDOMを入力として使用して、コマンドラインやJavaアプリケーションからSaxonを実行したことと、測定した方法と内容を少なくとも説明してください。 –

+0

どのような 'input'が渡されるのですか?' StreamSource'や 'SAXSource'を使ってSaxonが独自のツリーモデルを使うことができますか?それとも、あなたが使っているDOMSourceですか? –

+0

StreamSource私は – Xelian

答えて

1

サクソンを使用して統計分析を行ったが、常に多くの場合、Xalanのよりもはるかに高速ですが、ありません。それはすべて依存します:パフォーマンスでは、悪魔は詳細です。パフォーマンスは、変換コストではなく解析によって支配されることがあります。 Martin Honnenの示唆しているように、SaxonでDOMSourceを使用するのは非常に遅くなる可能性があります。 (Saxonは、ノード名を一致させるために整数指紋を使用することから大きく恩恵を得ています。標準DOMで動作させると完了できません)。

変更されていないXSLT 1.0スタイルシートを2.0プロセッサで実行すると、なぜなら、型情報(例えば、変数に型宣言がない)が非常に少なくなるため、プロセッサは実行時にすべてを決定する必要があるからです。加算が整数、倍精度、浮動小数点、または小数であるかどうか、および変換が必要かどうかを指定します。対照的に、1.0のプロセスは二重算術しか持たないので、決定はずっと簡単です。したがって、2.0プロセッサには本質的な欠点があります。しかし、通常サクソンはまだ勝つ。

インターネット上で逸話的な証拠を探している人は、古いXalan-Jインタプリタや新しいXSLTCコンパイラについて話しているのかどうかは分かりません。はるかに高速。

あなたの質問からわからないことの1つは、XSLTコードがうまく書かれているかどうかです。これは両刃の剣です。 Saxon-EEは他のほとんどの製品よりも最適化されています。コードが非常にうまく書かれているか、非常に単純なコードであれば、それを改善するためにあまり多くのことができないため、大きな利点はありません。同様に、コードが怪盗に悪い場合、オプティマイザはそれを保存しません。その中間には、良い最適化が時には20倍以上(またはそれ以上)進むことがある中間地があります。私が言うように、悪魔は詳細です。

+0

を使用しています。私は今それが怪盗になっていれば、私はそれを修正していただろうが、xsltが悪いと書かれているかどうかは言うまでもありません。 xsltがシンプルな場合は、ここで比較する内容によって異なります。しかし、テストのために私はプロジェクトからの最も簡単な変換を使用します。私たちはパフォーマンス上の問題のために良いxslt-sを書こうとしますが、xPathの選択には "//"を使用しません。名前付きテンプレートを使用し、choose文などを減らそうとします。 xsltにはビジネス固有のロジックが含まれているため、ここに投稿することはできません。 – Xelian

+1

Xalanでパフォーマンスが悪いので "//"のような構造を避けてしまえば、Saxonがうまく最適化する構造の1つで、優れたパフォーマンスを得ることができます。この種の議論は基本的には、コードを見て細部まで浸透するまではどこにも行きません。 –

+0

はい私は理解していますが、あなたは正しいですが、1MBに達したトンのxsltがあり、さまざまなシナリオを抽出するのは難しいかもしれませんが、試してみます。 トピックの主な目的は、Xpathには文字列がありますが、xsltプロセッサはランタイムを決定する必要があると述べたようなsaxon EEの変換バージョンを変更するだけの欠点があることを理解することでした実際のタイプです。このような状況では、移行のための仕事を減らそうとしているため、xslt 2.0の誤った使用のために変換が遅くなります。私はこのようなことを知りたいです – Xelian

関連する問題