Я оптимизирую утилиту customization → XML serialization, и все это сделано и работает, и это не проблема.
Он работал, загружая файл в объект XmlDocument
, а затем рекурсивно просматривая все дочерние узлы.
Я полагал, что, возможно, используя XmlReader
вместо того, чтобы XmlDocument
загрузить/разбор всей вещи будет быстрее, поэтому я также внедрил эту версию.
Алгоритмы точно такие же, я использую класс-оболочку для абстрактной функциональности работы с XmlNode
и XmlReader
. Например, методы GetChildren
yield возвращают либо дочерний XmlNode
, либо SubTree XmlReader
.
Итак, я написал тестовый драйвер для тестирования обеих версий и использовал нетривиальный набор данных (файл размером 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, который я разбираю, поэтому я не могу ее оптимизировать.