【发布时间】:2016-11-10 17:39:17
【问题描述】:
由于 XPath 2.0/XSLT 2.0,我想将我的 XslCompiledTransform 迁移到 Saxon 9.7.0.6 HE,但它比 .NET 慢得多。
我使用默认副本 ident XSLT 和 15.000 个 xml 文件测试了每个版本:
Saxon with Parallel.ForEach: 00:05:02.9013605
XslCompiledTransform with Parallel.ForEach: 00:00:15.6724146
Saxon with foreach: 00:10:09.7763861
XslCompiledTransform with foreach: 00:03:00.3483324
我希望我做错了什么,XslCompiledTransform:
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(xsl);
XmlWriterSettings writerSettings = xslt.OutputSettings.Clone();
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.DtdProcessing = DtdProcessing.Ignore;
readerSettings.XmlResolver = null;
Parallel.ForEach(files, file =>
{
string target = Path.Combine(output, Path.GetFileName(file));
using (XmlReader xr = XmlReader.Create(file, readerSettings))
using (XmlWriter xw = XmlWriter.Create(target, writerSettings))
xslt.Transform(xr, xw);
});
撒克逊版本:
Processor processor = new Processor();
DocumentBuilder docBuilder = processor.NewDocumentBuilder();
docBuilder.DtdValidation = false;
docBuilder.SchemaValidationMode = SchemaValidationMode.None;
docBuilder.WhitespacePolicy = WhitespacePolicy.PreserveAll;
XsltCompiler compiler = processor.NewXsltCompiler();
XsltExecutable executable = compiler.Compile(new Uri(xsl));
Parallel.ForEach(files, file =>
{
string target = Path.Combine(output, Path.GetFileName(file));
XsltTransformer transformer = executable.Load();
XdmNode input = docBuilder.Build(new Uri(file));
transformer.InitialContextNode = input;
Serializer serializer = new Serializer();
serializer.SetOutputFile(target);
transformer.Run(serializer);
});
更新
我在没有 Visual Studio 调试的情况下进行了另一次测试,结果好多了:
Saxon: 00:00:41.5990128
XslCompiledTransform: 00:00:19.0441044
所以主要的减速是调试器本身,但仅限于撒克逊人。 现在它只需要.NET版本的两倍时间,它不是超级棒,但我认为我可以这样做。
我可以做些什么来让 Saxon 更快?也许玩代码或使用 EE 而不是 HE?
这里有一些详细的基准信息,主要的性能问题是 DocumentBuilder.Build 方法。但即使是转换本身也比 .NET 版本慢一倍多:
撒克逊人:
.NET:
【问题讨论】:
-
您是否尝试过不使用 Parallel 运行测试?如果时差发生显着变化,则可能会提示原因。
-
您使用的是哪个版本的 Saxon,只是为了让我们了解您的比较是基于什么。
-
我更新了我的问题并添加了正常 foreach 和撒克逊版本的时间。
-
好吧,如果遇到性能问题,我们还需要知道您是使用 HE 还是 PE 还是 EE 版本,因为商业版本的性能肯定比开源 HE 更好。
-
我确实使用的是 HE 版本。也许有人可以用PE版本测试它,我不知道可能会有显着的性能差异。
标签: c# xslt saxon parallel.foreach xslcompiledtransform