почему анализ саксофона происходит быстрее, чем анализ синтаксиса? и как работает stax? - PullRequest
10 голосов
/ 29 сентября 2010

в некоторой степени относится к: libxml2 из Java

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

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

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

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

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

Спасибо

Ответы [ 4 ]

14 голосов
/ 30 сентября 2010

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

1.StAX является самым быстрым

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

2.SAX следующий

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

3.DOM последний

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

Ваш вариант использования

  • Если вам нужно поддерживать весь XML, DOM является стандартным представлением.Он полностью интегрируется с преобразованиями XSLT (javax.xml.transform ), XPath ( javax.xml.xpath ) и проверкой схемы ( javax.xml.validation ) API.Однако, если производительность является ключевой, вы можете построить свою собственную древовидную структуру с использованием StAX быстрее, чем DOM-анализатор может построить DOM.
10 голосов
/ 29 сентября 2010

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

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

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

10 голосов
/ 29 сентября 2010

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

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

1 голос
/ 30 сентября 2010

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

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

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

...