由于XPath 2.0 / XSLT 2.0,我想将XslCompiledTransform迁移到Saxon 9.7.0.6 HE,但是它比.NET慢。
我使用默认的副本标识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
因此,主要的减慢是调试器本身,但仅适用于Saxon。
现在它只花费.NET版本两倍的时间,虽然不是很好,但是我认为我可以接受。
我可以做些什么使Saxon更快?也许玩代码或使用EE代替HE?
这里是一些详细的基准信息,主要的性能问题是DocumentBuilder.Build方法。但是,即使转换本身也比.NET版本慢两倍以上:
撒克逊人:
。净:
最佳答案
凭借性能,魔鬼总是处在细节中。听起来这是一个值得做详细研究的情况,因此,如果您可以为我们(萨克萨尼卡州)提供运行该设备所需的一切,我们将很高兴为您提供帮助。
从您的数据中可以注意到的第一件事是,与Saxon相比,MS处理器从并行化中获得了更大的加速。这可能是由于NamePool争用:我们已经做了很多工作以减少NamePool在最新版本中的争用,但这是针对“典型工作负载”的,例如,我们需要检查您的文档是否都使用相同的词汇表。名称。
我首先要确定的是建立文档的成本和转换的成本。根据答案,后续调查将采取完全不同的过程。 (结果树的序列化成本也可能是一个因素,但这是不寻常的。)
已知Saxon的.NET版本比Java版本要慢得多。几年前,开销通常约为30%,但现在似乎有所增加,因此现在慢了3-5倍,尽管付出了巨大的努力,但我们仍未弄清原因。在这里,我们非常依赖IKVMC交叉编译器技术和OpenJDK库。
关于c# - C#Parallel.ForEach XslCompiledTransform与Saxon 9.7.0.6 HE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38261794/