почему sax parsing быстрее, чем DOM parsing? и как работает stax?

несколько связанных с: libxml2 из java

да, этот вопрос довольно многословный-извините. Я держался как можно плотнее. Я набрал смелости, чтобы легче было заглянуть в книгу, прежде чем читать ее целиком.

почему разбор sax быстрее, чем разбор dom? единственное, что я могу придумать, это то, что w / sax вы, вероятно, игнорируете большинство входящих данных и, таким образом, не тратите время на обработку частей xml вам все равно. IOW - после разбора w / SAX вы не можете воссоздать исходный ввод. если вы написали свой синтаксический анализатор SAX так, чтобы он учитывал каждый узел xml (и мог, таким образом, воссоздать оригинал), то он не будет быстрее, чем DOM?

причина, по которой я спрашиваю, заключается в том, что я пытаюсь быстрее анализировать xml-документы. Мне нужно иметь доступ ко всему дереву xml после синтаксического анализа. Я пишу платформу для сторонних сервисов для подключения, поэтому я не могу предвидеть, какие части xml-документа будут необходимы, а какие-нет. Я даже не знаю структуру входящего документа. Вот почему я не могу использовать JAXB или Sax. Объем памяти не является проблемой для меня, потому что xml-документы малы, и мне нужен только 1 в памяти за раз. Это время, необходимое для анализа этого относительно небольшого xml-документа, который убивает меня. Я не использовал stax раньше, но, возможно, мне нужно исследовать дальше, потому что это может быть середина земля? если я правильно понимаю, stax сохраняет исходную структуру xml и обрабатывает части, которые я прошу по требованию? таким образом, исходное время разбора может быть быстрым, но каждый раз, когда я прошу его пересечь часть дерева, которую он еще не пересек, именно тогда происходит обработка?

Если вы предоставите ссылку, которая отвечает на большинство вопросов, я приму ваш ответ (вы не должны прямо отвечать на мои вопросы, если они уже ответили в другом месте.)

update: я переписал его в sax, и он анализирует документы на avg 2.1 ms. Это улучшение (на 16% быстрее) по сравнению с 2,5 МС, которые принимал dom, однако это не та величина, о которой я (и др.) догадался бы

спасибо

4 ответов


предполагая, что вы ничего не делаете, кроме разбора документа, ранжирование различных стандартов парсера выглядит следующим образом:

1. Стакс-самый быстрый

  • событие сообщается вам

2. Саксофон следующий

  • он делает все, что делает StAX плюс содержимое реализуется автоматически (имя элемента, пространство имен, атрибуты, ...)

3. Дом последний

  • он делает все, что делает SAX, и представляет информацию как экземпляр узла.

Ваш Прецедент

  • Если вам нужно поддерживать весь XML, DOM является стандартным представлением. Он интегрируется чисто с преобразованиями XSLT (javax.XML.transform), XPath (javax.XML.в XPath) и при проверке схемы (javax.XML.проверка) APIs. Однако если производительность является ключевым, вы можете создать свою собственную древовидную структуру, используя StAX быстрее, чем парсер DOM может построить DOM.

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

SAX требует только столько памяти, сколько вам нужно для выполнения базового ввода-вывода, и вы можете извлечь необходимую информацию при чтении документа. Поскольку SAX ориентирован на поток, вы даже можете обработать файл, который все еще записывается другим процессом.


SAX быстрее, потому что Парсеры DOM часто используют парсер SAX для внутреннего анализа документа, а затем выполняют дополнительную работу по созданию и манипулированию объектами для представления каждого узла, даже если приложение не заботится о них.

приложение, которое использует SAX напрямую, вероятно, будет использовать набор информации более эффективно, чем "парсер" DOM.

StAX-это счастливая среда, где приложение получает более удобный API, чем управляемый событиями SAX подход, но не страдает неэффективностью создания полного DOM.


SAX быстрее, чем DOM (обычно при чтении большого XML-документа), потому что SAX дает вам информацию в виде последовательности событий (обычно доступ через обработчик), в то время как DOM создает узлы и управляет структурой создания узлов до тех пор, пока дерево DOM не будет полностью создано (как представлено в XML-документе).

для относительно небольших файлов вы не почувствуете эффекта (за исключением того, что, возможно, дополнительная обработка выполняется DOM для создания элемента узла и / или узла включенный.)

Я не могу комментировать StAX, так как я никогда не играл с ним.