【发布时间】:2018-01-19 08:05:01
【问题描述】:
(注意:这篇文章主要是通过回复建议编辑的)
我目前在 dotNet 处理器和 Saxon-HE 9.8 处理器中运行几乎相同的 xslt,但我发现 Saxon(2.2 秒)比 dotNet(0.03 秒)慢得多。那么我该如何解决呢?这是我的【简化】xml示例,只需复制<A>~<Z>并重复粘贴50次,我认为大小只有10kb左右:
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="OutputFile.xslt"?>
<Header>
<A><![CDATA[NOTHING]]></A>
<B><![CDATA[NOTHING]]></B>
<C><![CDATA[NOTHING]]></C>
<X>_R_testXR12</X>
<Y>_R_testYR12</Y>
<Z>_R_testZR12</Z>
</Header>
这是我的代码:
撒克逊 C#
var processor = new Processor();
var compiler = processor.NewXsltCompiler();
var executable = compiler.Compile(new Uri(xslt.FullName));
var transformer = executable.Load30();
var serializer = new Serializer();
FileStream outStream = new FileStream(output.ToString(), FileMode.Create, FileAccess.Write);
serializer.SetOutputStream(outStream);
using (var inputStream = input.OpenRead())
{
/*timer start*/
var watch = Stopwatch.StartNew();
transformer.ApplyTemplates(inputStream, serializer);
/*timer end*/
watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Console.WriteLine(elapsedMs); Console.Read();
outStream.Close();
}
撒克逊 XSLT
<!-- Saxon in xslt-->
<xsl:stylesheet version="3.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="NodesExtraCRI" select="/Header/*[( starts-with(text(), '_R_testZR'))]"></xsl:variable>
<xsl:for-each select = "$NodesExtraCRI">
<xsl:sort select = "text()" data-type = "number" order = "ascending"/>
<xsl:value-of select="text()"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
.NET C#
// Enable XSLT debugging.
XslCompiledTransform xslt = new XslCompiledTransform(true);
// Compile the style sheet.
xslt.Load(stylesheet);
// Execute the XSLT transform.
/*timer start*/
var watch = System.Diagnostics.Stopwatch.StartNew();
FileStream outputStream = new FileStream(outputFile, FileMode.Append);
xslt.Transform(sourceFile, null, outputStream);
/*timer end*/
watch.Stop(); var elapsedMs = watch.ElapsedMilliseconds; Console.WriteLine(elapsedMs); Console.Read();
.NET XSLT
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" indent="yes"/>
<xsl:template match="/">
<xsl:variable name="NodesExtraCRI" select="/Header/*[( starts-with(text(), '_R_testZR'))]"></xsl:variable>
<xsl:for-each select = "$NodesExtraCRI">
<xsl:sort select = "text()" data-type = "number" order = "ascending"/>
<xsl:value-of select="text()"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
【问题讨论】:
-
什么是“dotNet”处理器(XslCompiledTransform、XslTransform、XmlPrime)?你到底是怎么测量的?分享给出这些时间的代码或方法。
-
谢谢,我编辑了它
-
一般来说,你必须知道 Saxon 9 HE for .NET 和 Microsoft 的 XslCompiledTransform 有非常不同的架构,Saxon 是作为 Java 应用程序开发的,然后与 IKVM 交叉编译到 .NET,必须在 .NET 上携带各种提供基于 Java 的运行时结构的程序集,另一方面 XslCompiledTransform 是从 XSLT 1 到 .NET 的 CIL 的编译器,因此它在纯运行时性能方面 XslCompiledTransform 可能总是领先于 Saxon .NET 他。 Saxon EE 的性能可能比 HE 更好,因为它包含字节码生成。