Библиотеки Erlang JSON: производительность сериализации?

Для Erlang имеется ряд библиотек JSON, и мне это не ясно, которые имеют лучшие характеристики производительности (и, во-вторых, простоту использования), особенно для сериализации erlang-to-json.

В моем случае используется как JSON-синтаксический анализ, так и сериализация, но код Erlang, вероятно, будет производить как минимум на два порядка больше выходного сигнала JSON (то есть сериализации), чем он получит вход.

Для справки, библиотеки, о которых я знаю, включают следующие (и могут быть другие, которых я не нашел):

Ответ 1

Я использую rfc4627.erl (я наткнулся на это, и производительность не была проблемой)

Тем не менее, я ожидаю, что различные библиотеки erlang на основе ресурсов будут работать одинаково хорошо. Они разделяют идеи (как показано в комментарии к коду). AFAIK mochijson и rfc4627 используют один и тот же исходный формат erlang.

eep018 является C, и поскольку он стремится реализовать... hrm... eep-0018, собственный кодировщик term_to_json, который может быть включен в будущую версию Erlang. Никогда не пробовал и не поддерживал.

Моя последняя рекомендация - с mochiweb mochijson (2). Это де-факто стандарт и активно поддерживается, используется, среди прочих, CouchDB и Facebook.

Что касается выбора между mochijson и mochijson2, this может вам помочь.

Ответ 2

Попробуйте https://github.com/si14/erl_json_test тесты erlang json. Он включал контрольные показатели для:

  • Элемент списка

  • JSONX

  • Jiffy

  • Mochijson2

  • JSX

Ответ 3

Я использовал jsonerl в последнее время. Он основан на mochijson2 и намного проще и интуитивно понятен в использовании.

Ответ 4

Надеюсь, что этот ответ не будет плохо принят:

Я также просмотрел разбор и сериализацию JSON для проекта. Мне пришлось обрабатывать много данных параллельно, поэтому Эрланг прозвучал великолепно! Но многие из них занимались строками в виде данных JSON, и там, где все было кислым.

Как вы, вероятно, знаете, что строки в Erlang являются полноценными списками символов. В отличие от строк в большинстве языков (a char является "около" байта), каждый символ в Erlang представлен целым 32-битным целым числом! Итак, уже ваши строки довольно большие.

Поскольку это список, доступ к данному элементу строки - O (N), а не O (1), как вы ожидали в массиве Chars. И, поскольку строки неизменны в Erlang, простая конкатенация может оказаться очень медленным процессом. В конце я понял, что просто пытался использовать неправильный язык.

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