我们的程序经常联系其他系统来获取数据,并且频繁地将数据从其他系统公开的合同复制到所需的应用程序合同模式。因此,我们创建了一个接受XSLT文件的实用程序,这将转换为所需的对象。因此,开发新模块的人必须只提供XSLT文件。现在我觉得有一个性能命中,特别是当传入的对象稍大时,当它被序列化进行转换时,它会更大,占用大量内存。那么还有一种方法可以进一步优化吗?我正在使用XSLT编译变换这比正常变换更好吗?或者还有其他方法可以提高性能吗?请咨询
答案 0 :(得分:4)
从.NET 3.5开始,xsltc.exe http://msdn.microsoft.com/en-us/library/bb399405.aspx作为.NET framework SDK的一部分,它允许您预编译XSLT样式表,以减少加载时{} 1}通常必须执行的工作一个XSLT样式表作为XML文档。我不知道这是否适合您,因为您似乎将各种XSLT样式表作为输入。
至于内存消耗,XSLT(1.0以及2.0)适用于完整XML输入文档的内存树模型,因此除了让XSLT使用大量输入文档之外,没有太多可以做的事情来保持内存使用率低处理器选择自己喜欢的树实现。对于XslCompiledTransform
,XslCompiledTransform
中的XPathDocument
。
你可以探索的其他选择是转向第三方XSLT 2.0(XQSharp,Saxon 9)甚至是像Saxon 9.3这样的3.0实现,因为Saxon 9.3有一个流模式http://www.saxonica.com/documentation/sourcedocs/streaming.xml,可以帮助保持低内存使用率处理大型或大型输入文档。
答案 1 :(得分:0)
现在我觉得有表演 特别是当传入时 物体稍微大一点,当它 为序列化进行转换 会更大更大 很多记忆。那么有办法吗? 进一步优化?。
这不是具体问题,因为任何与效果相关的问题都应。
应该执行测量以识别任何现有瓶颈,然后才考虑优化这些瓶颈。
或者引用Donald Knuth :
“过早优化是其根源 所有的邪恶“
为了能够执行XSLT转换,根本不需要序列化XmlDocument
或XPathDocument
对象。 XslCompiledTransform
的 Transform()
方法有许多重载接受IXPathNavigable
参数。
我正在使用XSLT编译变换Is 这比正常变换更好 ?
.NET中没有任何称为“正常转换”的东西。你可能指的是Transform
类。如果是这样,答案是这个类在.NET1.1中使用,并且自五年前就已经过时了。 XslCompiledTransform
类是应该用于XSLT 1.0转换的类。它是任何供应商中速度最快的XSLT 1.0处理器之一。