уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В продолжение статьи об инструменте для просмотра JSON решил разобраться с вопросом: какой самый быстрый парсер JSON есть в Delphi? На сегодняшний день у Delphi-разработчиков более, чем достаточно различных библиотек для работы с JSON, в том числе имеются и «родные» классы для JSON. И хотелось бы узнать, какая из библиотек окажется самой быстрой.В качестве теста я решил проверить, как справятся библиотеки с парсингом файла, размером в 189 Мб (ссылка).

Библиотеки, которые тестировались:

Какие-то из этих библиотек развиваются и постоянно  дорабатываются, например, как x-SuperObject, а какие-то давно уже «умерли», но, тем не менее, на просторах Интернета о них упоминается чаще, чем о других может быть более новых библиотеках, о которых я не в курсе.

Тест проводился согласно демонстрационным примерам к библиотекам

В тесте я обращал внимание не только на время, которое потребуется библиотеке, чтобы распарсить большой файл, но и размер оперативной памяти, который займет программа после того, как библиотека справится с большим JSON. В «спокойном» состоянии тестовая программа занимает в оперативной памяти 1,4 Мб.

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

Вот какие результаты в итоге были получены:

Библиотека Время парсинга Объем занимаемой памяти, Mb
lkJson 00:00:13.9 1008,3
Delphi Web Utils 00:03:46.6 912,4
SuperObject Out of Memory
x-SuperObject Out of Memory
Fast JSON lib Программа зависла
System.JSON Out of Memory

Три библиотеки (SuperObject, System.Json и FastJson lib) не справились с разбором тестового файла.

При этом FastJSON lib на протяжении получаса «отъедала» 51,4% CPU и 911 Mb оперативной памяти, но так ничего и не распарсила.

x-SuperObject  справилась с задачей один раз, затратив на это чуть более 50 секунд, второй и третий разы выдала out of Memory.

SuperObject и System.Json сошли с дистанции практически сразу, выкинув перед этим «Out of Memory».

Из оставшихся самой быстрой оказалась библиотека lkJson, которая справилась с заданием за примерно 14 секунд и заняла в памяти чуть больше 1 Гб.

Delphi Web Utils затратила в 14 раз больше времени (3 минуты 46 секунд), но в памяти заняла примерно на 100 Мб меньше.

Что тут можно сказать…lkJson, как и Delphi Web Utils не обновлялись с 2013 года, однако с задачей парсинга большого JSON справились. Так что, если вы ищите небольшую, но достаточно быструю библиотеку для парсинга больших и очень больших JSON-объектов, то, думаю, что Вам стоит присмотреться к lkJson.

Если у кого-то имеются сведения о других быстрых библиотеках для работы с большими JSON, то буду благодарен, если поделитесь ссылочками на сайты библиотек в комментариях к этой статье.

Книжная полка

Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
купить книгу delphi на ЛитРес
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
13 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Александр Чечулин

Пользуюсь mORMot. Там есть похожее исследование. То, которое «Huge content» на том же файле citylots.json.
http://blog.synopse.info/post/json-benchmark-delphi-mormot-superobject-dwsjson-dbxjson

Вот что получилось на моей машине:

2.1. Huge content:
— Download files if necessary: no assertion 219us
— Synopse beautifier: 1 assertion passed 723.75ms 192 B
— Synopse read record: 4 assertions passed 905.75ms 228,053/s 113.5 MB
— Synopse read variant: 2 assertions passed 2.22s 92,755/s 377.4 MB
— Synopse cross platform: 2 assertions passed 3.98s 51,787/s 424.8 MB
— Synopse read to BSON: 3 assertions passed 1.44s 142,973/s 168.1 MB
Total failed: 0 / 12 — Huge content PASSED 9.94s

Лешик Программист

А парсят то они как?
Загружают в память и парсят или частями?

Дмитрий
Дмитрий
26/10/2016 15:31
Al Sish
27/10/2016 13:19

А можете привести характеристики железа на котором проводились тесты?
Пользуюсь uJSON.

Анонимно
03/11/2016 02:37

mORMot нужен в сравнении.
Как с x64?
Что, если скомпилировать 32-битный тест с флагом {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}?

непо дарок
06/11/2016 18:01

какая версия Delphi ?

непо дарок
06/11/2016 18:06

>>lkJson, как и Delphi Web Utils не обновлялись с 2013
дата обновления lkJson на sourceforge — 2009
у вас есть более свежая версия?

Юрий
Юрий
11/11/2016 22:46

Влад, не валидный тест провёл
Для такого объёма данных надо было x64 компелить

И SuperObject будет быстрее (поиск и выдёргивание нужной веточки) т.к. он индексы строит, в отличии от других парсеров

Артем
Артем
16/11/2016 22:16
Ответить на  Юрий

Согласен, распарсить — это только часть истории. Важно во что парсить, т.е. конечный результат, наличие валидаций и т.д.

Виктор
Виктор
23/10/2017 02:50

Юрий и Влад — пардон, но от ваших комментариев отдает диванным «теоретизмом».

для 64 версии прога в памяти будет занимать 4гб, и отрабатывать файл далеко не за секунду.
Если уж она на 32 вылетает в out мемори, то какой быстроты и потребления памяти ждать в 64 версии?

Ждем ваших результатов.