En realidad no hace falta una alternativa
ruby/json es un poco más lento que oj, pero la diferencia no es grande.
oj es popular por su rendimiento, pero puede causar varios problemas.
- Uno de los problemas de
oj es un tema de seguridad provocado por el monkey patch mediante Oj.mimic_JSON.
La responsabilidad del monkey patch
Oj.mimic_JSON y Oj.optimize_rails reemplazan implementaciones menos eficientes de JSON, pero pueden generar problemas.
- Por ejemplo, pueden ignorar la opción
script_safe, lo que puede dejarlo vulnerable a ataques XSS.
- Los monkey patches deben aplicarse con cuidado y manejarse de forma segura conforme evoluciona la API.
Inestabilidad
oj fue una de las principales causas de crashes de Ruby en operaciones a gran escala.
oj se desarrolla de forma muy activa, por lo que aparecen nuevos crashes con frecuencia.
- En el codebase de
oj había hacks sucios difíciles de considerar confiables.
Trabajo de base
- La idea es mejorar
ruby/json hasta acercarlo al rendimiento de oj y así reducir la necesidad de monkey patches.
- Se configuraron benchmarks y se usó un profiler de C para analizar el rendimiento.
Evitar verificaciones duplicadas
- En el benchmark de
JSON.dump, se mejoró el rendimiento evitando verificaciones UTF-8 duplicadas.
- Al eliminar el trabajo redundante entre
rb_enc_str_asciionly_p e isLegalUTF8, se logró una mejora de rendimiento del 3%.
Verificar primero las condiciones más baratas y más probables
- En la función
fbuffer_inc_capa, se optimizó la condición que comprueba si el búfer ya estaba asignado, logrando una mejora de rendimiento del 15%.
Reducir el costo de configuración
- Al reducir el costo de configuración de
ruby/json, el rendimiento mejoró mucho en microbenchmarks.
Evitar seguir punteros
- Al eliminar la llamada a
rb_enc_get, el rendimiento mejoró un 8%.
Tabla de consulta
- Usar una tabla de consulta mejoró en 30% el rendimiento del volcado de cadenas JSON.
Continuará
- Hay más optimizaciones, pero se cubrirán en el siguiente artículo.
1 comentarios
Comentarios de Hacker News
El uso predeterminado de jbuilder en Rails es uno de los factores que vuelve más lento el renderizado de JSON
Se preguntan si hay información sobre cuánto tiempo tarda la nueva versión en parsear/codificar el volcado JSON de Twitter
El artículo sobre este tema es muy fácil de entender y da ganas de hacer benchmarks y optimizar código Ruby
Es un excelente artículo y trabajo
Es un artículo muy interesante
Les encanta el trabajo de byroot
El consejo sobre perfiles en C fue excelente
Les impresionó el truco de rendimiento llamado "lookup table" usado en el PR de Mame
String#each_codepointen lugar deString#each_charpuede reducir la carga del GCComparten un ejemplo de cómo mejoraron aún más el rendimiento en su propia base de código
Array#packpara recopilar codepoints y convertirlos enStringEn los CPU modernos, las pistas de predicción de ramas no sirven de mucho
Se preguntan si Ruby JSON usa intrinsics