C# 什么';使用XslCompiledTransform的正确方法是什么?

C# 什么';使用XslCompiledTransform的正确方法是什么?,c#,asp.net,xml,xslt,C#,Asp.net,Xml,Xslt,不幸的是,我正在一个网站上工作,该网站使用XSL进行所有操作。表演糟透了。在JIT中花费的时间大约是30% 我一直认为,这家公司需要4台服务器来运行它的小站点这一事实取决于XSL,但我终于做了一次适当的性能审查,尽管XSL完全是罪魁祸首,但我怀疑XSL不应该如此糟糕,因为最初的程序员(JavaScript人员)误用了XslCompiledTransform类型 问题是,我自己也不能更好地使用这个API。该类已为.NET 2.0更新,并包含编译缓存。我花了一整天的时间试图弄清楚缓存在什么情况下有效

不幸的是,我正在一个网站上工作,该网站使用XSL进行所有操作。表演糟透了。在JIT中花费的时间大约是30%

我一直认为,这家公司需要4台服务器来运行它的小站点这一事实取决于XSL,但我终于做了一次适当的性能审查,尽管XSL完全是罪魁祸首,但我怀疑XSL不应该如此糟糕,因为最初的程序员(JavaScript人员)误用了
XslCompiledTransform
类型

问题是,我自己也不能更好地使用这个API。该类已为.NET 2.0更新,并包含编译缓存。我花了一整天的时间试图弄清楚缓存在什么情况下有效;最初,代码为每个转换生成了一个
xslcomiledtransform
,这似乎不正确,但将其设置为静态也无济于事-性能分析没有显示出任何改进

此外,在调试器输出窗格中,我可以看到为同一样式表弹出的“System.Xml.Xsl.CompiledQuery.5”,因此它看起来像是在编译,每次都再次加载

我突然想到,也许我应该做缓存,也就是说,我应该为每个样式表(预加载或延迟加载)保存一个包含这些
xslcomiledtransform
实例的存储

是这样吗??为每个样式表保留一个实例并多次调用
Load
是不正确的?

作为一个c#dev id,建议使用saxon的xslt方法


xpath的ms实现如果过时了。而且也不是那么快

编译样式表通常比运行样式表花费更长的时间。您应该编译样式表一次,并重用CompiledStylesheet对象来运行每个转换


(感谢John Nicholas推荐使用Saxon,我衷心赞同这一点,但这与这个问题无关,因为Saxon API也很容易被误用。)

看看XSLT编译器(xsltc.exe),在构建时而不是运行时编译XSL转换。。。。关于用法,请参见:是的,我的理解是您需要自己缓存XslCompiledTransform。这不是在内部完成的。我从来没有遇到过如何实际进行缓存的最佳实践,但是当我需要跟踪多个缓存时,我通常会保存一个
字典
,其中键是每个转换的名称,如果字典没有我想要运行的,我会加载它并将其添加到字典中。不管您最终如何进行缓存,请记住要小心线程并发问题和锁定,因为这是针对网站的。@JLRishe我完全按照您所说的做了,并使用了ConcurrentDictionary:)