Я оптимизирую пользовательский объект -> утилиту сериализации XML, и все это сделано и работает, и это не проблема.
Он работал, загружая файл в XmlDocument
объект, а затем рекурсивно проходя через все дочерние узлы.
Я подумал, что, возможно, использование XmlReader
вместо XmlDocument
загрузки / анализа всего этого будет быстрее, поэтому я реализовал и эту версию.
Алгоритмы точно такие же, я использую класс-обертку, чтобы абстрагировать функциональность работы с XmlNode
против XmlReader
. Например, выход метода GetChildren
возвращает либо дочерний элемент XmlNode
, либо поддерево XmlReader
.
.
Итак, я написал тестовый драйвер для тестирования обеих версий и использовал нетривиальный набор данных (XML-файл объемом 900 КБ, содержащий около 1350 элементов).
Однако, используя JetBrains dotTRACE, я вижу, что версия XmlReader
на самом деле медленнее, чем версия XmlDocument
! Кажется, что во время итерации по дочерним узлам XmlReader
происходит некоторая значительная обработка.
Итак, я говорю все это, чтобы спросить:
Каковы преимущества / недостатки XmlDocument
и XmlReader
, и при каких обстоятельствах вы должны их использовать?
Я предполагаю, что существует порог размера файла, при котором XmlReader
становится более экономичным по производительности, а также менее требовательным к памяти. Тем не менее этот порог превышает 1 МБ.
Я каждый раз вызываю ReadSubTree
для обработки дочерних узлов:
public override IEnumerable<IXmlSourceProvider> GetChildren ()
{
XmlReader xr = myXmlSource.ReadSubtree ();
// skip past the current element
xr.Read ();
while (xr.Read ())
{
if (xr.NodeType != XmlNodeType.Element) continue;
yield return new XmlReaderXmlSourceProvider (xr);
}
}
Этот тест применим ко многим объектам на одном уровне (то есть, широкий и неглубокий) - но мне интересно, насколько хорошо XmlReader
стоит, когда XML глубокий и широкий? То есть XML, с которым я имею дело, очень похож на модель объекта данных, 1 родительский объект для многих дочерних объектов и т. д .: 1..M..M..M
Я также не знаю заранее структуру XML-файла, который я анализирую, поэтому я не могу оптимизировать его.