2

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 倍以上遅くなります。

サクソン:

サクソン人

。ネット:

。ネット

4

2 に答える 2

1

パフォーマンスでは、悪魔は常に細部に宿ります。これは、詳細な調査を行う価値のあるシナリオのように思えます。そのため、実行に必要なすべてのものを私たち (Saxonica) に提供していただければ、喜んで検討させていただきます。

あなたの数値から最初にわかることは、MS プロセッサは並列化によって Saxon よりもはるかに高速化されるということです。これは、NamePool の競合が原因である可能性があります。最近のリリースで NamePool の競合を減らすために多くのことを行ってきましたが、それは「典型的なワークロード」のためのものであり、たとえば、ドキュメントがすべて同じ語彙を使用しているかどうかを調べる必要があります。名前。

最初に確認したいのは、ドキュメントの作成にかかるコストと変換にかかるコストです。その答え次第で、その後の捜査は全く別の道をたどる。(結果ツリーのシリアル化コストも要因になる可能性がありますが、それは異常です。)

Saxon の .NET バージョンは、Java バージョンよりも大幅に遅いことが知られています。何年も前には約 30% のオーバーヘッドがありましたが、これが増加したようで、現在は 3 倍から 5 倍遅くなり、かなりの努力にもかかわらず、原因を突き止めることができませんでした。ここでは、IKVMC クロスコンパイラ テクノロジと OpenJDK ライブラリに大きく依存しています。

于 2016-07-08T10:09:16.327 に答える
0

私は Saxon の DocumentBuilder.Build(XmlReader) でテストを行い、両方のテストを実行しました。

Console.WriteLine("Saxon:");
for (int i = 0; i < 3; i++)
{
    sw.Reset();
    sw.Start();
    Parallel.ForEach(files, file =>
    {
        string target = Path.Combine(output, Path.GetFileName(file));
        XsltTransformer transformer = executable.Load();
        XdmNode input = null;
        using (XmlReader xr = XmlReader.Create(file, readerSettings))
            input = docBuilder.Build(xr);
        transformer.InitialContextNode = input;
        Serializer serializer = new Serializer();
        serializer.SetOutputFile(target);
        transformer.Run(serializer);
    });
    sw.Stop();
    Console.WriteLine("Duration: " + sw.Elapsed);
    RemoveFiles(output);
}

Console.WriteLine("XslCompiledTransform:");
for (int i = 0; i < 3; i++)
{
    sw.Reset();
    sw.Start();
    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);
    });
    sw.Stop();
    Console.WriteLine("Duration: " + sw.Elapsed);
    RemoveFiles(output);
}

結果は次のとおりです。

Saxon: 210.679ms
XslCompiledTransform: 179.129ms

これは素晴らしい結果だと思います。Saxon バージョンは、XslCompiledTransform バージョンよりも 17.61% 長い時間しか必要としません。XPath 2.0 と Xslt 2.0 を使用できますが、パフォーマンスの低下は 20% 未満です。

サクソン:

サクソン人

XslCompiledTransform:

ここに画像の説明を入力

于 2016-07-11T05:43:12.277 に答える