Что быстрее в разборе XML: элементы или атрибуты? - PullRequest
1 голос
/ 22 ноября 2010

Я пишу код, который анализирует XML.

Я хотел бы знать, что быстрее анализировать: элементы или атрибуты.

Это будет иметь прямое влияние на мой дизайн XML.

Пожалуйста, укажите ответы на C # и различия между LINQ и XmlReader.

Спасибо.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2010

Создайте свою XML-схему так, чтобы представление информации имело смысл. Обычно решение о том, чтобы сделать что-либо в атрибуте или элементе, не повлияет на производительность.

Проблемы производительности с XML в большинстве случаев связаны с большими объемами данных, которые представлены на очень многословном диалекте XML. Типичные меры противодействия - это сжатие данных XML при хранении или передаче по проводам.

Если этого недостаточно, возможно, стоит перейти на другой формат, такой как JSON, ASN.1 или собственный двоичный формат.

Решение второй части вашего вопроса. Основное различие между классами XDocument (LINQ) и XmlReader заключается в том, что класс XDocument создает в памяти полную объектную модель документа (DOM), которая дорогостоящая операция, тогда как класс XmlReader предоставляет вам токенизированный поток во входном документе.

3 голосов
/ 22 ноября 2010

В XML скорость зависит от множества факторов.

Что касается атрибутов или элементов, выберите тот, который более точно соответствует данным.В качестве ориентира мы используем атрибуты для атрибутов объекта;и элементы для вложенных подобъектов.

В зависимости от объема данных, о которых вы говорите, использование атрибутов может немного сэкономить на размере ваших потоков XML.Например, <person id="123" /> меньше, чем <person><id>123</id></person> Это на самом деле не влияет на анализ, но влияет на скорость отправки данных по сетевому проводу или загрузки их с диска ... Если мы говорим о тысячах такихзаписи, это может иметь значение для вашего приложения.

Конечно, если это действительно имеет значение, тогда лучше использовать JSON или некоторое двоичное представление.

Первыйвопрос, который вам нужно задать, это то, требуется ли XML.Если он не должен быть читаемым человеком, то, вероятно, лучше использовать двоичный файл.Черт, CSV или даже файл с фиксированной шириной может быть лучше.

Что касается LINQ vs XmlReader, то это сводится к тому, что вы делаете с данными во время их анализа.Вам нужно создать экземпляр группы объектов и обработать их таким образом, или вам просто нужно прочитать поток, как только он поступит?Возможно, вы даже обнаружите, что простейшее / лучшее решение - просто выполнить простейшие манипуляции с данными.

Дело в том, что вам, вероятно, потребуется изучить сильные стороны каждого подхода, помимо того, что "разбирает быстрее".

1 голос
/ 22 ноября 2010

Не имея точных цифр, чтобы доказать это, я знаю, что команда WCF в Microsoft решила сделать DataContractSerializer своим стандартом для WCF. Он ограничен тем, что не поддерживает атрибуты XML, но на самом деле он работает на 10-15% быстрее, чем XmlSerializer.

Исходя из этой информации, я предполагаю, что использование атрибутов XML будет выполняться медленнее, чем при использовании только элементов XML.

...