LINUX.ORG.RU

Парсер JSON, написанный на D, стал самым быстрым парсером JSON в мире

 ,


7

9

Долго время производительность JSON-парсера на D оставляла желать лучшего. Однако в последнее время ситуация начала меняться. На смену устаревшему парсеру std.json пришел новый экспериментальный парсер stdx.data.json, нацеленный на включение в Phobos. Однако несколько дней назад вышел релиз нового экспериментального парсера fast, который не только обошел все другие реализации, но и сделал парсер JSON на D самым быстрым парсером в мире, обгоняя парсер на Python в более чем 6 раз по памяти и в 14 раз по скорости. Ниже приведены замеры его производительности.

Language 	Time,s 	Memory, Mb
D Gdc Fast 	0.34 	226.7
C++ Rapid 	0.79 	687.1
C++ Gason 	0.83 	582.2
Rust 	 	1.26 	234.7
Crystal Schema 	1.62 	293.2
Crystal 	2.59 	1061.4
Crystal Pull 	2.70 	1.2
Nim Clang 	3.30 	1280.3
Nim Gcc 	3.57 	1284.0
Python Pypy 	4.99 	1365.4
C++ LibJson 	5.49 	2796.3
Go 	 	6.07 	479.4
Ruby YAJL 	8.23 	1085.5
Python 		9.85 	1409.1

>>> Подробности

★★

Проверено: JB ()
Последнее исправление: Wizard_ (всего исправлений: 9)

Ответ на: комментарий от anonymous

Все знают, что их обгоняет С, а С в свою очередь в два раза обгоняет Java.

А ассемблер их не обгоняет, потому что компиляторы умнее человека.

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

Это ведь ты, правда? Скажи что ты один из них!?

Deleted
()
Ответ на: комментарий от Deleted

Это ведь ты, правда? Скажи что ты один из них!?

Нет, иначе я бы уже выкатил свои бенчмарки.

anonymous
()
Ответ на: комментарий от anonymous

А компилятор с компилятором все равно умнее.

Deleted
()

о JSON::XS «скромно» забыли

rsync ★★
()
Ответ на: комментарий от Ghostwolf

Зачем нужен JSON, когда есть INI?

Json удобно гонять по сети через WebSocket.В ini удобно сохранять конфигурацию на диск. Разные задачи.

arm-skif
()
Ответ на: комментарий от anonymous

Так... Вот с этим я уже наигрался, спасибо...

deterok ★★★★★
()
Ответ на: комментарий от arcanis

Вообще ini умеет во вложенность. А вот со списками да, печалька.

В Qt есть класс QSettings - он умеет массивы. Ini файл будет выглядеть:

[prefix]
1\key=110
2\key=90
3\key=400
size=3
arm-skif
()

бенчмарк мерит не json-парсинг, а время отработки программ и интерпретаторов со след. логикой:

  • открыть файл
  • прочитать json
  • суммировать значения из json-структуры

..

bananym
()
Ответ на: комментарий от t184256

Ок, а подвох?

Ок, а подвох?

Удваиваю вопрос. Не верю, что возможно написать новую YOBA-реализацию какой-то в меру тривиальной вещи. Либо стандарт не полностью поддерживается, либо на каких-нибудь сочетаниях специальных символов начинает жестоко тормозить, если не падать, либо выхлоп у разных парсеров разный.

Camel ★★★★★
()
Последнее исправление: Camel (всего исправлений: 1)
Ответ на: комментарий от abc

YAML rocks!

ВЫ еще yaml вспомните

Кто тут вспомнил YAML? Отличный язык разметки.

Camel ★★★★★
()
Ответ на: Ок, а подвох? от Camel

так написали уже Парсер JSON, написанный на D, стал самым быстрым парсером JSON в мире (комментарий)
на мой взгляд 1) и 2) нисколько не компрометируют реализацию, насчет 3) и 4) ничего сказать не могу, код не смотрел

pkkk
()
Ответ на: Ок, а подвох? от Camel

Ну там активная работа со строками, её можно делать крайне наивно. Да и simd тоже прибавляет каких-то попугаев.

Gorthauer ★★★★★
()

обгоняя парсер на Python в более чем 6 раз по памяти и в 14 раз по скорости

Так все пользуются ujson же!

ggrn ★★★★★
()

что за странное сравнение, в котором есть Ruby YAJL, который является биндингом к сишному YAJL, но нет самого YAJL? O_O

т.е. оно может и не повлияло бы, но всё равно странно так сравнивать...

vitalif ★★★★★
()

Парсер JSON написанный на D стал самым быстрым парсером JSON в мире

okay

это D никак не поможет

umren ★★★★★
()

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

sargeman
()

JSON-парсер на D

Он не только стал самым быстрым, но и самым ненужным!

ostin ★★★★★
()
Ответ на: комментарий от anonymous

// Calculate SSE word boundary before 'str'
// SSE aligned pointer <= 'str.ptr'.
Что из этого можно сделать на Го?

А что из этого будет работать на ARM и MIPS?

pftBest ★★★★
()
Ответ на: комментарий от jori

Ехал public через void

Как вы _этим_ пользуетесь? Это же АД.

Этот ад

а) довольно удобен при чтении чужих больших исходников. Чем меньше всяких неявных умолчаний тем легче разбираться.

б) вопрос привычки. Да и вообще у ява-платформы достаточно плюсов, чтобы терпеть ее дубовый синтаксис. А можно еще scala/kotlin/ceylon взять.

Nagwal ★★★★
()
Ответ на: комментарий от jori

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

Bfgeshka ★★★★★
()
Ответ на: комментарий от Bfgeshka

Развитые IDE появились относительно недавно. До этого писали в емаксах и прочих блокнотах. И ничего, уделывали и С++ и всё остальное.

Legioner ★★★★★
()

Тесты не валидны. С++ версия тестов использует убого написаный файловый ввод/вывод. Новость ниочем.

anonymous
()
Ответ на: комментарий от Legioner

Это довольно сомнительно. Емаксы и прочие блокноты от IDE отличаются функционалом в меньшей степени, нежели в большей. Не всякий блокнот, но их немало таких с хорошим потенциалом.

И вот если посадить действительно за какой-нибудь кастрированный блокнот вроде nano, то скорость разработки, я гарантирую это, упадёт. Потому что язык очень многословный и ничего ты с этим не сделаешь.

Про уделывание крестов и прочих - опять же, смотря в чём.

Bfgeshka ★★★★★
()
Ответ на: комментарий от Xroft

Авторы пакетного менеджера dub за каким-то чертом json в нем заменили даже не на ini, а на богом забитый негуглимый формат sdl.

Фигасе, я только что узнал об этом.

А его кто-то реально использует? По-моему, все пакеты как пользовались, так и пользуются dub.json (который, правда, как известно, даже не совсем json, а невалидный-json-с-поддержкой-висячих-запятых). Это что, кто-то собрался депрекейтить? Или можно не обращать внимания?

greatperson
()

Нужно добавить в новость:
Shortcomings:
- Rejects numbers with exponents of huge magnitude (>=10^28)
- Only works on Posix x86/amd64 systems
- No write capabilities
- Data size limited by available contiguous virtual memory

pftBest ★★★★
()
Последнее исправление: pftBest (всего исправлений: 1)
Ответ на: комментарий от Bfgeshka

Это довольно сомнительно.

Что именно довольно сомнительно? Java вышла в 1995 году. Первый вменяемый эклипс в 2004 году. Половину своей истории для Java не было вменяемой IDE.

И вот если посадить действительно за какой-нибудь кастрированный блокнот вроде nano, то скорость разработки, я гарантирую это, упадёт.

Время набора текста это дай бог 10% от общего времени разработки. А то и 1-2%. Если время набора текста увеличится в 2 раза (пессимистичный сценарий), то время разработки увеличится на 10%.

Упадёт комфортность разработки. Повысится число багов. Это да. Но так в любом языке. Удобные инструменты повышают качество жизни и качество кода.

Потому что язык очень многословный и ничего ты с этим не сделаешь.

C++ не менее многословный. А то и более. Ничего, пишут в блокнотах как-то.

Про уделывание крестов и прочих - опять же, смотря в чём.

В удобстве разработки, качестве конечного результата.

Legioner ★★★★★
()

сделал парсер JSON на D самым быстрым парсером в мире, обгоняя парсер на Python в более чем 6 раз по памяти и в 14 раз по скорости.

Парсер на D обогнал парсер на Python. Ну это великое достижение. Жду отчета об обгоне парсера на lua, javascript, etc.

andreyu ★★★★★
()

Скачал, собрал, запустил что смог...

Javascript Node
0.49962461411279646
0.5000679585097806
0.5003248037503812
2.32s, 909.7Mb
Ruby
0.49962461411279646
0.5000679585097806
0.5003248037503812
8.18s, 2093.7Mb
D
0.49962461
0.50006796
0.50032480
8.81s, 1416.5Mb

meil
()
Ответ на: Ок, а подвох? от Camel

Либо парсит он его в нечто отличное от традиционного понимания.

t184256 ★★★★★
()
Ответ на: комментарий от pkkk

нисколько не компрометируют реализацию

Компрометирует в том плане, что это не «самый быстрый парсер на D», а быстрый парсер на С который вшит в D. То есть реализация не использует никакие фичи D, по этому портировать его на С не составит труда, многие части даже простым копипастом.

Вот пример кода оттуда:

char* dst = cast(char*) memcpy(buffer ? buffer : malloc(str.length + 1), str.ptr, str.length);

Сходу можно подумать что это С.

Это аналогично самому быстрому парсеру на Python, который тупо вызывает С код, но смотрите какой Python быстрый и другие языки не нужны.

anonymous
()
Ответ на: комментарий от Legioner

Развитые IDE появились относительно недавно. До этого писали в емаксах и прочих блокнотах. И ничего, уделывали и С++ и всё остальное.

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

andreyu ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.