.NET中XSLT转换的性能问题

3
我们的程序经常与其他系统进行联系,从中获取数据,并且经常从其他系统公开的合同中复制数据到所需的应用程序合同模式。因此,我们创建了一个实用程序,它接受XSLT文件,并将其转换为所需的对象。因此,任何开发新模块的人只需提供XSLT文件即可。现在我感觉性能有所下降,特别是当传入的对象稍微大一点时,当对其进行转换序列化时,它会变得更大并占用更多内存。那么有没有进一步优化的方法?我正在使用XSLT编译转换,这比普通转换更好吗?还是有其他方法可以提高性能?请给予建议。

你可能需要先诊断瓶颈在哪里。它可能在XSLT中,也可能不在。你测量了IO延迟(直接使用HTTP调用来获取XML和XSLT吗)?你对XSLT进行过剖析分析(大量的//和其他低效的XSLT代码将在处理大型文档时更糟糕)。编译过的,但极其低效的XSLT仍会在处理大型文档时运行缓慢。 - Mads Hansen
你说“现在我感觉性能有所下降”。你的第一步必须是调查这种“感觉”是否符合实际情况。简而言之,你需要设定性能目标并进行测量。不要仅仅基于“感觉”就考虑为了提高性能而进行任何更改。 - Michael Kay
来自 新手 的评论:你尝试过在生产环境中监控性能吗? - Daniel Haley
2个回答

4
自从.NET 3.5以来,.NET Framework SDK中有xsltc.exe http://msdn.microsoft.com/en-us/library/bb399405.aspx,它允许您预编译XSLT样式表,以减少加载XSLT样式表作为XML文档时XslCompiledTransform通常需要执行的工作量。我不知道这是否适用于您,因为您似乎会得到各种XSLT样式表作为输入。 至于内存消耗,XSLT(1.0和2.0)使用完整XML输入文档的内存树模型进行操作,因此除了让XSLT处理器选择其自己喜欢的树实现之外,您无法做太多事情来保持内存使用低。在XslCompiledTransform的情况下,它是System.Xml.XPath中的XPathDocument。 您可以探索的其他选项包括转移到第三方XSLT 2.0(XQSharp,Saxon 9)甚至3.0实现(如Saxon 9.3),因为Saxon 9.3具有流模式http://www.saxonica.com/documentation/sourcedocs/streaming.xml,可以帮助在处理大型或非常大型输入文档时保持内存使用低。

0
现在我感觉性能有所下降,特别是当传入的对象稍微大一些时,当它被序列化进行转换时,它会变得更大并占用更多内存。那么有没有办法进一步优化呢?
这不是一个具体的问题,因为任何与性能相关的问题都应该进行测量以确定是否存在瓶颈,然后再考虑优化。
或者引用 Donald Knuth 的话:
“过早的优化是万恶之源”
一个 XmlDocument 或 XPathDocument 对象根本不需要被序列化才能执行 XSLT 转换。XslCompiledTransform 方法有许多重载,可以接受 IXPathNavigable 参数。
我正在使用 XSLT 编译转换,这比普通转换好吗?

在.NET中没有所谓的“正常转换”。您可能指的是Transform类。如果是这样,答案是该类在.NET1.1中使用过,并且已经被废弃了五年。应该使用XslCompiledTransform类进行XSLT 1.0转换。它是任何供应商存在的最快速的XSLT 1.0处理器之一。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接