Я хотел перенести свой XslCompiledTransform в Saxon 9.7.0.6 HE из-за XPath 2.0/XSLT 2.0, но это медленнее, чем .NET.C# Parallel.ForEach XslCompiledTransform vs. Saxon 9.7.0.6 HE
Я проверил каждую версию с копией по умолчанию идента 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, но это не очень здорово, но я думаю, что смогу с этим справиться.
Есть ли что-нибудь, что я могу сделать, чтобы сделать Саксон быстрее? Может быть, играть с кодом или использовать EE вместо HE?
Вот некоторые подробные контрольные данные, основная проблема с производительностью - это метод DocumentBuilder.Build. Но даже преобразование сама по себе более чем в два раза медленнее версии .NET:
Saxon:
.NET:
Вы пробовали запустить тест без параллели? Если разница во времени значительно меняется, это может дать нам подсказку. –
Какая версия Saxon вы используете, просто чтобы мы могли понять, на чем базируется ваше сравнение. –
Я обновил свой вопрос и добавил время для обычного foreach и Saxon Version. – Tony