Библиотеки 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, простая конкатенация может оказаться очень медленным процессом. В конце я понял, что просто пытался использовать неправильный язык.
По всей вероятности, вы уже знаете все эти вещи, но я чувствовал, что было бы полезно оставить это в качестве ответа для других, которые могут прийти на ваш пост в будущем.