En réalité, aucune alternative n’est nécessaire
ruby/json est légèrement plus lent que oj, mais l’écart n’est pas important.
oj est populaire pour ses performances, mais peut provoquer divers problèmes.
- L’un des problèmes de
oj est un risque de sécurité causé par le monkey patch via Oj.mimic_JSON.
La responsabilité du monkey patch
Oj.mimic_JSON et Oj.optimize_rails remplacent une implémentation moins efficace de JSON, mais cela peut entraîner des problèmes.
- Par exemple, ils peuvent ignorer l’option
script_safe, ce qui peut les rendre vulnérables aux attaques XSS.
- Un monkey patch doit être appliqué avec prudence et évoluer en toute sécurité au rythme de l’évolution de l’API.
Instabilité
oj a été l’une des principales causes de crashs Ruby en production à grande échelle.
oj est développé de manière très active, si bien que de nouveaux crashs apparaissent fréquemment.
- Le code de
oj contenait des hacks douteux auxquels il était difficile de faire confiance.
Travail de fond
- L’objectif est d’améliorer
ruby/json pour atteindre des performances comparables à oj et ainsi réduire le besoin de monkey patches.
- Des benchmarks ont été mis en place et un profileur C a été utilisé pour analyser les performances.
Éviter les vérifications en double
- Les performances ont été améliorées dans le benchmark
JSON.dump en évitant des vérifications UTF-8 redondantes.
- La suppression du travail en double entre
rb_enc_str_asciionly_p et isLegalUTF8 a permis un gain de performances de 3 %.
Vérifier d’abord les conditions les moins coûteuses et les plus probables
- Dans la fonction
fbuffer_inc_capa, l’optimisation de la condition qui vérifie si le buffer est déjà alloué a permis un gain de performances de 15 %.
Réduire le coût de configuration
- La réduction du coût de configuration de
ruby/json a fortement amélioré les performances dans les microbenchmarks.
Éviter le suivi de pointeurs
- La suppression de l’appel à
rb_enc_get a amélioré les performances de 8 %.
Table de consultation
- L’utilisation d’une table de consultation a amélioré de 30 % les performances du dump de chaînes JSON.
À suivre
- D’autres optimisations existent, mais elles seront abordées dans le prochain article.
1 commentaires
Avis Hacker News
L’utilisation par défaut de jbuilder dans Rails est l’un des facteurs qui ralentissent le rendu JSON
Je me demande s’il existe des informations sur le temps nécessaire à la nouvelle version pour parser/encoder le dump JSON de Twitter
L’article sur ce sujet est très facile à comprendre et donne envie de benchmarker et d’optimiser du code Ruby
Excellent article et excellent travail
Article très intéressant
J’adore le travail de byroot
Les conseils sur les profileurs C étaient excellents
L’astuce de performance dite de la "lookup table" utilisée dans la PR de Mame était impressionnante
String#each_codepointau lieu deString#each_charpeut réduire la charge du GCQuelqu’un a partagé un exemple d’amélioration supplémentaire des performances dans sa propre base de code
Array#packpour collecter les codepoints puis les convertir enStringSur les CPU modernes, les indications de prédiction de branchement sont inutiles
Je me demande si le JSON de Ruby utilise des intrinsèques