由於XPath 2.0/XSLT 2.0,我想將我的XslCompiledTransform遷移到Saxon 9.7.0.6 HE,但它比.NET慢。C#Parallel.ForEach XslCompiledTransform與Saxon 9.7.0.6 HE
我測試的每個版本與一個默認的拷貝的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
所以主減速是調試器本身,但僅限於撒克遜人。 現在它只需要.NET版本的兩倍,它不是超級棒,但我認爲我可以做到這一點。
我能做些什麼來讓撒克遜人變得更快?也許玩代碼或使用EE而不是HE?
這裏是一些詳細的基準測試信息,主要的性能問題是DocumentBuilder.Build方法。但是,即使是變換本身是兩倍以上.NET版本慢:
撒克遜:
.NET:
你試過沒有運行並行測試?如果時差顯着變化,那麼它可能會提示原因。 –
您正在使用哪個版本的Saxon,只是爲了讓我們瞭解您的比較是基於什麼。 –
我更新了我的問題,並添加了正常的foreach和撒克遜版本的時間。 – Tony