由于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版本慢两倍以上:

撒克逊人:

c# - C#Parallel.ForEach XslCompiledTransform与Saxon 9.7.0.6 HE-LMLPHP

。净:

c# - C#Parallel.ForEach XslCompiledTransform与Saxon 9.7.0.6 HE-LMLPHP

最佳答案

凭借性能,魔鬼总是处在细节中。听起来这是一个值得做详细研究的情况,因此,如果您可以为我们(萨克萨尼卡州)提供运行该设备所需的一切,我们将很高兴为您提供帮助。

从您的数据中可以注意到的第一件事是,与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/

10-09 06:41
查看更多