XPath 2.0/XSLT 2.0 のため、XslCompiledTransform を Saxon 9.7.0.6 HE に移行したかったのですが、.NET よりもかなり遅いです。
デフォルトの copy 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
そのため、主な速度低下はデバッガー自体にありましたが、Saxon のみでした。今では .NET バージョンの 2 倍の時間しかかからず、それほど素晴らしいものではありませんが、それでいいと思います。
Saxon を高速化するためにできることはありますか? コードで遊んだり、HE の代わりに EE を使用したりしますか?
ここにいくつかの詳細なベンチマーク情報があります。主なパフォーマンスの問題は DocumentBuilder.Build メソッドです。ただし、変換自体でさえ、.NET バージョンの 2 倍以上遅くなります。
サクソン:
。ネット: