Разница между синтаксическим анализом с использованием строки или потока (Poco C++)

Я написал простой иерархический json-парсер, используя POCO JSON, который будет использоваться в качестве парсера саксофона. Есть ли разница в результате, если я использую строку или поток в качестве входных данных для метода синтаксического анализа, см. вызов ниже, или разные конструкторы эквивалентны?

Parser parser;
DefaultHandler handler;
parser.setHandler(&handler);
parser.parse(input);

С точки зрения потребления памяти, скорости и т.д.?


person David Karlsson    schedule 06.04.2013    source источник


Ответы (1)


Версия std::string — это просто обертка, которая создает поток от вашего имени, так что в конце сумма будет примерно такой же, строка просто более удобна для пользователя.

[РЕДАКТИРОВАТЬ]

Это было изменено для версии 1.5.2 — упаковка была удалена, так что теперь обе (потоковая и строковая) версии повторяются. пример сравнительного анализа может использоваться для определения того, насколько поток медленнее, чем строка.

[/РЕДАКТИРОВАТЬ]

Обратите внимание, что в версии 1.5.2 есть несколько критических изменений — имя DefaultHandler. был удален, а внутренний обработчик был преобразован в автоматически создаваемый интеллектуальный указатель (это основная причина, по которой нам пришлось устареть DefaultHandler, чтобы существующий код не передал созданный стеком обработчик интеллектуальному указателю, это был не очень хороший дизайн для начала). Таким образом, в версии 1.5.2 больше не потребуется явное создание обработчика для парсинга по умолчанию:

std::string json = "{ \"test\" : null }";
Parser parser;
Var result = parser.parse(json);

Если вас беспокоит производительность, учтите также, что скорость парсера Poco::JSON в его нынешнем виде низкая, и мы будем использовать либо очень быстрый парсер из Poco::Web::JSON или что-то быстрее (если мы сможем найти/записать) . В итоге 1.5.x все еще W.I.P.

Надеюсь это поможет.

РЕДАКТИРОВАТЬ:

контрольные показатели на Windows и Mac (файл JSON ~ 15 МБ):

Windows

Poco::JSON: 1 195 313 ​​[нас]
Poco::Web::JSON: 403 320 [нас]
json-parser: 321 289 [нас]
libjson: 610 352 [нас]

MAC (лязг)

Poco::JSON: 480 965 [нас]
Poco::Web::JSON: 176 297 [нас]
json-parser: 220 172 [нас]

person Alex    schedule 06.04.2013
comment
И у него есть характеристики SAX-парсера? - person David Karlsson; 12.06.2013
comment
В 1.5.2 обработчик по умолчанию (ParseHandler) ведет себя более похоже на DOM (т. е. сохраняет все дерево в памяти); конечный пользователь может легко предоставить обработчик с поведением, подобным SAX. - person Alex; 14.06.2013