Améliorations et dépréciations des API du gem Ruby JSON

2025-08-09

Cet article détaille les raisons et les spécificités des améliorations et dépréciations apportées par le mainteneur aux API du gem Ruby JSON. Trois points clés sont abordés : premièrement, l’option `create_additions: true` est dépréciée en raison de problèmes de sécurité, et il est recommandé d’utiliser `JSON.unsafe_load` ou de passer explicitement l’option ; deuxièmement, la tolérance par défaut aux clés dupliquées est dépréciée, l’utilisation de `allow_duplicate_key: true` étant suggérée ; enfin, bien que `Object#to_json` ne soit pas dépréciée, une nouvelle API `JSON::Coder` est introduite, offrant une méthode de sérialisation JSON plus sûre et plus flexible, ce qui résout les problèmes de comportement et de configuration globaux. L’auteur souligne la nécessité de peser le pour et le contre de la dépréciation des API et met en évidence le fait que les nouvelles API améliorent la sécurité et réduisent les risques d’erreur.

Lire plus
Développement

Débloquer les performances de Ruby Ractor : élimination de la contention des variables de classe

2025-05-28

Cet article explore un goulot d’étranglement des performances dans les Ractors de Ruby lors de la gestion des variables d’instance de classe. Le verrouillage global de l’interpréteur entraîne une dégradation significative des performances lorsque plusieurs Ractors accèdent concurremment à ces variables. L’auteur analyse méticuleusement l’implémentation sous-jacente des variables d’instance de classe et propose une solution utilisant la délégation d’objets pour éliminer la contention de verrouillage, ce qui entraîne une amélioration des performances de près de trois fois dans les micro-benchmarks. Cette solution corrige également de manière inattendue un bogue et une régression de performances introduits par la nouvelle fonctionnalité Espace de noms.

Lire plus
Développement

Améliorer les performances de Ruby Ractor : résolution du goulot d'étranglement de `object_id`

2025-04-27

Le modèle de concurrence Ractor de Ruby souffre de limitations de performances dues à des verrous globaux. Cet article examine en profondeur un goulot d'étranglement de performances causé par la méthode `object_id`, résultant de choix de conception historiques et d'améliorations de la collecte des ordures. En optimisant l'implémentation de `object_id`, en le stockant directement dans les objets au lieu d'utiliser une recherche dans une table de hachage globale, l'auteur améliore considérablement les performances de Ractor, ce qui entraîne un doublement de la vitesse dans les benchmarks JSON. Bien que des défis subsistent, tels que la gestion des types d'objets spéciaux, ce travail représente une étape cruciale pour rendre les Ractors véritablement parallèles.

Lire plus
Développement

Améliorer les protocoles de bases de données : le point de vue de l’expérience développeur

2025-04-05

Cet article traite des lacunes des protocoles clients des bases de données SQL, notamment MySQL et PostgreSQL. L’auteur souligne les problèmes de gestion des connexions, de récupération d’erreurs et d’instructions préparées, ce qui entraîne une complexité de développement accrue. Par exemple, l’état mutable de la connexion rend la récupération d’erreurs difficile, tandis que la nature à portée de session des instructions préparées limite leur utilisation dans les pools de connexions. L’auteur propose des améliorations en s’inspirant du protocole Redis, telles qu’une phase de configuration explicite, des clés d’idempotence et des identifiants d’instructions préparées à portée globale. Ces changements simplifieraient les workflows de développement et amélioreraient la fiabilité des clients de bases de données, pour une meilleure expérience développeur et des bases de données plus conviviales.

Lire plus
Développement protocole

HTTP/2 : Pourquoi cela n'a pas d'importance dans les serveurs HTTP Ruby

2025-02-25

Cet article discute de la pertinence de la prise en charge d'HTTP/2 dans les serveurs HTTP Ruby tels que Puma. L'auteur soutient que si le principal avantage d'HTTP/2, le multiplexage pour des temps de chargement de page plus rapides, est significatif sur Internet, il offre peu d'avantages sur un réseau local. La faible latence et les connexions longue durée sur un réseau local minimisent l'impact du slow start TCP. De plus, la fonctionnalité de push du serveur HTTP/2 s'est avérée préjudiciable et a été remplacée par la fonctionnalité 103 Early Hints plus élégante. L'auteur préconise de laisser la gestion d'HTTP/2 aux équilibreurs de charge ou aux proxies inversés, simplifiant ainsi le déploiement et la maintenance du serveur d'applications.

Lire plus
Développement Performances Réseau

Le Mythe de l'Application Rails Liée à l'E/S

2025-01-25

Il est communément admis que les applications Rails sont intrinsèquement liées à l'E/S, la base de données étant le principal goulot d'étranglement des performances, ce qui rend les performances de Ruby moins critiques. Cet article remet en question cette idée. Bien que la base de données soit effectivement un goulot d'étranglement pour le scaling, l'auteur soutient que cela ne signifie pas que l'application passe la majeure partie de son temps à attendre l'E/S. L'analyse des améliorations de performances de YJIT et des problèmes de performances courants (comme les index de base de données manquants) suggère que de nombreuses applications Rails sont en réalité liées au processeur. L'article souligne la confusion entre la famine du processeur et l'attente de l'E/S, et souligne que le choix du modèle d'exécution approprié (asynchrone, threadé ou basé sur les processus) dépend du ratio E/S/CPU de l'application. L'auteur appelle à une attention accrue sur les performances de Ruby et souligne les possibilités d'optimisation au sein de Rails lui-même.

Lire plus
Développement

Optimisation du JSON Ruby : une histoire d’allocation de pile et d’intégration en ligne

2025-01-02

Cet article de blog, quatrième partie d’une série sur l’optimisation des performances de JSON en Ruby, détaille le parcours de l’auteur pour améliorer la vitesse de sérialisation JSON de Ruby. Grâce à des micro-benchmarks et à un profilage méticuleux, l’auteur explore des techniques d’allocation de pile et d’intégration en ligne. En déplaçant l’allocation de tampon de la mémoire système vers la pile et en utilisant l’intégration en ligne de manière stratégique, des gains de performances significatifs sont obtenus. Toutefois, l’article souligne l’importance de trouver un équilibre entre les améliorations des micro-benchmarks et les performances des applications réelles, en montrant un cas où l’optimisation a eu un impact négatif sur les ensembles de données plus importants.

Lire plus
Développement

Optimisation du JSON Ruby : Partie 1

2024-12-18

Cet article de blog explique comment l’auteur a optimisé la gemme `json` de Ruby pour en faire l’un des analyseurs et générateurs JSON les plus rapides. Au lieu de techniques complexes, des optimisations simples ont été appliquées sur la base du profilage, telles que l’évitement des vérifications redondantes, la priorisation des conditions moins coûteuses, la réduction des coûts de configuration et l’utilisation de tables de recherche. Ces améliorations s’appliquent au code C et au code Ruby. Les optimisations ont considérablement amélioré les performances de la gemme `json`, la rendant compétitive par rapport à des alternatives telles que `oj`, réduisant le besoin de correctifs de type « monkey patch » et résolvant les problèmes de stabilité et de compatibilité liés à `oj`.

Lire plus