2016-08-24 86 views
0

我們使用XalanJ 2.7.1以及1.0兼容的xslt文件。我們希望用Saxon-EE 9.7更改爲xslt 2.0,所以我們希望進行一些可行性研究,以便更快地實施。從以前的所有互聯網研究都表明,XalanJ是最慢的。只需更改版本即可將Xslt 1.0更改爲XSLT 2.0

XalanJ平均時間的轉換平均時間爲989毫秒,但Saxon-EE的版本從1.0改爲2.0,相同的xslt規則平均運行時間爲1100毫秒。

這是否意味着我們必須重寫我們的xslt文件,或者它可能與性能測量錯誤? 如果改變必須改變,具體是什麼?

編輯2:

測試性能pourposes我們只是創建使用

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(); 

然後使用GugleGuava的秒錶來測量的transfor方法時示例應用程序。我執行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

至少要說明你做了什麼(從命令行或從Java應用程序運行Saxon,使用Saxon的API和樹模型,或者使用JAXP和可能的DOM作爲輸入?)以及如何和測量什麼。 –

+0

什麼樣的'input'是你傳入的,你可以使用'StreamSource'還是'SAXSource'來讓Saxon使用它自己的樹模型?或者是你使用的DOMSource? –

+0

我使用的StreamSource – Xelian

回答

1

撒克遜人往往比Xalan的更快做出統計分析,但並非總是如此。這一切都取決於:魔鬼的表現在細節中。有時候,性能主要是通過解析而不是轉換成本。正如Martin Honnen所暗示的,與撒克遜一起使用DOMSource可能會非常緩慢。 (Saxon通過使用整數指紋來匹配節點名稱,並且在標準DOM上運行時無法完成這一操作,因此Saxon得到了很大的提升。)

用2.0處理器運行未更改的XSLT 1.0樣式表總是有點這是一個挑戰,因爲只有很少的類型信息(例如沒有變量的類型聲明),所以處理器必須在運行時決定所有的東西,例如無論加法是整數,雙精度,浮點還是小數,以及是否需要任何轉換。相比之下,1.0過程只有雙算術,所以決策要容易得多。所以2.0處理器有一個固有的缺點,但通常撒克遜仍然贏。

如果你正在網上尋找軼事證據,你需要知道人們並不總是清楚他們是在談論舊的Xalan-J解釋器還是新的XSLTC編譯器,它是快多了。

我們不知道你的問題的一件事是XSLT代碼是否寫得很好。這是一把雙刃劍。 Saxon-EE擁有比大多數其他產品更強大的優化器。如果代碼編寫得很好,或者代碼非常簡單,那沒有太大的優勢,因爲改進代碼可以做的不多。同樣,如果代碼非常糟糕,那麼優化器將不會保存它。在兩者之間有一箇中間地帶,優化有時可以讓事情快20倍(或更多)。正如我所說,魔鬼是在細節。

+0

很難說xslt寫得不好,如果我現在覺得它很糟糕我會一直解決它。 如果xslt簡單,這取決於你在比較什麼。但是對於測試,我使用項目中最簡單的轉換。我們嘗試編寫好的xslt-s是因爲性能問題,我們沒有使用「//」來選擇xPath,我們使用命名模板,嘗試減少選擇語句等等。 xslt包含業務特定邏輯,因此我無法在此處發佈。 – Xelian

+1

好吧,如果你避免了像「//」這樣的構造,因爲它在Xalan中表現不好,那麼這是一個恥辱,因爲這是Saxon優化的結構之一,實際上它可以爲你帶來出色的性能提升。這種討論基本上沒有進行,直到你開始查看代碼並深入細節。 –

+0

是的,我明白你說得對,但是我們有大量的xslt達到了1MB,它將會提取不同的場景,但我會盡力的。 該主題的主要目的是瞭解是否存在一些缺點,只是使用更改saxon EE的轉換版本,就像你提到的那樣,在Xpath中我們有字符串,但xslt處理器必須決定運行時間,這是實際類型。因此,在這種情況下,由於xslt 2.0的錯誤用法,轉換速度較慢,因爲希望減少遷移工作。我想知道這樣的事情 – Xelian