2009-10-30 2 views
10

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

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

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

+0

также есть модуль JSON в YAWS. – jldupont

+1

eep0018 теперь исполняется этой библиотекой: https://github.com/davisp/jiffy – Dfr

ответ

9

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

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

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

Моя последняя рекомендация: mochiweb's mochijson (2). Это de facto стандарт и активно поддерживается, используемый, в частности, CouchDB и Facebook.

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

-2

Надеюсь, этот ответ не будет плохой ed, однако:

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

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

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

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

+6

Вы должны использовать двоичные файлы в таких случаях, _not_ строки. –

+0

Вы должны узнать что-то о списках io. –

+0

И вы должны что-то узнать о кодировании строк юникода, например utf-8, когда доступ к символам сразу становится O (N). – rvirding

2

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

Смежные вопросы