В продолжение статьи об инструменте для просмотра 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 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Пользуюсь 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
А парсят то они как?
Загружают в память и парсят или частями?
Интересно сравнить с mORMot
http://blog.synopse.info/post/json-benchmark-delphi-mormot-superobject-dwsjson-dbxjson
А можете привести характеристики железа на котором проводились тесты?
Пользуюсь uJSON.
У меня комп старенький:
Intel Pentium 3,2 GHz
12 Gb оперативки DDR-2
2 GB Video
mORMot нужен в сравнении.
Как с x64?
Что, если скомпилировать 32-битный тест с флагом {$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}?
какая версия Delphi ?
У меня Delphi 10.1 Berlin, более новой версии lkJson нет
>>lkJson, как и Delphi Web Utils не обновлялись с 2013
дата обновления lkJson на sourceforge — 2009
у вас есть более свежая версия?
Влад, не валидный тест провёл
Для такого объёма данных надо было x64 компелить
И SuperObject будет быстрее (поиск и выдёргивание нужной веточки) т.к. он индексы строит, в отличии от других парсеров
Согласен, распарсить — это только часть истории. Важно во что парсить, т.е. конечный результат, наличие валидаций и т.д.
Юрий и Влад — пардон, но от ваших комментариев отдает диванным «теоретизмом».
для 64 версии прога в памяти будет занимать 4гб, и отрабатывать файл далеко не за секунду.
Если уж она на 32 вылетает в out мемори, то какой быстроты и потребления памяти ждать в 64 версии?
Ждем ваших результатов.
Виктор, у меня только один результат — пересобрал в х64 программу, которая использовала X-SuperObject. Файл размером более 300 Мб распарсился. Время не замерял, но по субъективным ощущениям, на парсинг ушло минуты 4-5. Без out of mtmory, как это было в 32-битной версии программы.