2009-10-30 12 views
10

Existen varias bibliotecas JSON disponibles para Erlang, y no me queda claro cuáles tienen las mejores características de rendimiento (y, en segundo lugar, facilidad de uso), especialmente para la serialización erlang-to-json.Erlang JSON libraries: rendimiento de serialización?

Mi caso de uso requiere tanto el análisis JSON como la serialización, pero el código de Erlang probablemente producirá al menos dos órdenes de magnitud más de salida JSON (es decir, serialización) de lo que recibirá la entrada.

Como referencia, las bibliotecas que conozco incluyen los siguientes (y puede haber otros que no he encontrado):

+0

también está el módulo JSON en YAWS. – jldupont

+1

eep0018 ahora está reemplazado por esta lib: https://github.com/davisp/jiffy – Dfr

Respuesta

9

utilizo rfc4627.erl (me topé con él, y el rendimiento no ha sido un problema)

Sin embargo, sí espero las diferentes bibliotecas nativas de Erlang funcionan de manera similar también. Comparten ideas (como se vio en el code comments). AFAIK mochijson y rfc4627 comparten el mismo formato de fuente erlang.

eep018 es C, y ya que se esfuerza por poner en práctica ... hrm ... eep-0018, el codificador nativa term_to_json que podría incluirse en una versión futura de Erlang. Nunca lo intenté y no parece mantenido activamente.

Mi última recomendación es ir con Mochiweb's mochijson (2). Es el estándar de facto y mantenido activamente, utilizado por, entre otros, CouchDB y Facebook.

En cuanto a elegir entre mochijson y mochijson2, this podría ayudarlo.

-2

Esperemos que esta respuesta no sea mal recibida ed, sin embargo:

Yo también busqué en el análisis JSON y la serialización para un proyecto. Tuve que procesar una gran cantidad de datos en paralelo, por lo que Erlang sonaba genial! Pero mucho de eso fue lidiar con cadenas en forma de datos JSON, y ahí es donde las cosas se pusieron feas.

Como probablemente sepa, las cadenas en Erlang son listas completas de caracteres. A diferencia de las cadenas en la mayoría de los lenguajes (una char es "aproximadamente" un byte), ¡cada personaje en Erlang está representado por un entero entero de 32 bits! Entonces, ya tus cadenas son bastante grandes.

Como se trata de una lista, el acceso a un elemento determinado de la cadena es O (N) en lugar de O (1) como se esperaba en una matriz de Caracteres. Y, como las cadenas son inmutables en Erlang, la concatenación simple puede terminar siendo un proceso muy lento. Al final me di cuenta de que simplemente estaba tratando de usar el lenguaje equivocado.

Es muy probable que ya sepa todas estas cosas, pero sentí que era útil dejar esto como una respuesta para otros que puedan llegar a su publicación en el futuro.

+6

Deberías usar binarios en tales casos, _not_ strings. –

+0

Debería aprender algo sobre las listas de io. –

+0

Y debe aprender algo sobre la codificación de cadenas de caracteres unicode, por ejemplo utf-8, cuando el acceso a caracteres se convierte inmediatamente en O (N). – rvirding

2

Últimamente he estado usando jsonerl. Está basado en mochijson2 y es mucho más fácil e intuitivo de usar.

Cuestiones relacionadas