2016-08-24 88 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