我们的程序经常与其他系统进行联系,从中获取数据,并且经常从其他系统公开的合同中复制数据到所需的应用程序合同模式。因此,我们创建了一个实用程序,它接受XSLT文件,并将其转换为所需的对象。因此,任何开发新模块的人只需提供XSLT文件即可。现在我感觉性能有所下降,特别是当传入的对象稍微大一点时,当对其进行转换序列化时,它会变得更大并占用更多内存。那么有没有进一步优化的方法?我正在使用XSLT编译转换,这比普通转换更好吗?还是有其他方法可以提高性能?请给予建议。
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,可以帮助在处理大型或非常大型输入文档时保持内存使用低。在.NET中没有所谓的“正常转换”。您可能指的是Transform
类。如果是这样,答案是该类在.NET1.1中使用过,并且已经被废弃了五年。应该使用XslCompiledTransform
类进行XSLT 1.0转换。它是任何供应商存在的最快速的XSLT 1.0处理器之一。
//
和其他低效的XSLT代码将在处理大型文档时更糟糕)。编译过的,但极其低效的XSLT仍会在处理大型文档时运行缓慢。 - Mads Hansen