Verbesserungen und Deprecations der APIs des Ruby JSON Gems

2025-08-09

Dieser Beitrag beschreibt die Gründe und Einzelheiten der Verbesserungen und Deprecations der APIs des Ruby JSON Gems durch den Maintainer. Drei Hauptbereiche werden behandelt: Erstens wird die unsichere Option `create_additions: true` als veraltet markiert, wobei `JSON.unsafe_load` oder die explizite Übergabe der Option empfohlen wird. Zweitens wird die Standardtoleranz für doppelte Schlüssel als veraltet markiert, und die Verwendung von `allow_duplicate_key: true` wird vorgeschlagen. Drittens wird zwar `Object#to_json` nicht als veraltet markiert, aber eine neue `JSON::Coder` API eingeführt, die eine sicherere und flexiblere JSON-Serialisierung bietet und globale Verhaltensweisen und Konfigurationsprobleme behebt. Der Autor betont die Notwendigkeit, die Vor- und Nachteile der Deprecation von APIs abzuwägen, und hebt hervor, dass die neuen APIs die Sicherheit verbessern und das Fehlerrisiko reduzieren.

Mehr lesen
Entwicklung

Entsperren der Ruby-Ractor-Leistung: Beseitigung der Konkurrenz um Klassenvariable

2025-05-28

Dieser Beitrag befasst sich mit einem Performance-Engpass in Rubys Ractoren bei der Behandlung von Klasseninstanzvariablen. Das globale Interpreter-Lock führt zu einer signifikanten Performance-Verschlechterung, wenn mehrere Ractoren gleichzeitig auf diese Variablen zugreifen. Der Autor analysiert die zugrunde liegende Implementierung von Klasseninstanzvariablen sorgfältig und schlägt eine Lösung mit Objektdelegation vor, um die Lock-Konkurrenz zu beseitigen, was zu einer fast dreifachen Performance-Verbesserung in Microbenchmarks führt. Diese Lösung behebt auch unerwartet einen Fehler und eine Performance-Regression, die durch das neue Namespace-Feature eingeführt wurden.

Mehr lesen
Entwicklung

Steigerung der Ruby Ractor-Leistung: Behebung des Engpasses von `object_id`

2025-04-27

Rubys Ractor-Konkurrenzmodell leidet unter Leistungseinbußen aufgrund globaler Sperren. Dieser Beitrag untersucht eingehend einen Leistungseinbruch, der durch die `object_id`-Methode verursacht wird, die auf historischen Designentscheidungen und Verbesserungen der Garbage Collection beruht. Durch die Optimierung der Implementierung von `object_id`, indem sie direkt in Objekten gespeichert wird, anstatt eine globale Hash-Tabellen-Suche zu verwenden, verbessert der Autor die Ractor-Leistung deutlich, was zu einer Verdoppelung der Geschwindigkeit in JSON-Benchmarks führt. Obwohl Herausforderungen bleiben, wie der Umgang mit speziellen Objekttypen, stellt diese Arbeit einen entscheidenden Schritt dar, um Ractors wirklich parallel zu machen.

Mehr lesen
Entwicklung

Verbesserung von Datenbankprotokollen: Eine Perspektive auf die Entwicklererfahrung

2025-04-05

Dieser Artikel befasst sich mit den Mängeln in den Client-Protokollen von SQL-Datenbanken, insbesondere MySQL und PostgreSQL. Der Autor weist auf Probleme bei der Verbindungsverwaltung, Fehlerwiederherstellung und vorbereiteten Anweisungen hin, die zu einer erhöhten Komplexität der Entwicklung führen. Beispielsweise macht der veränderliche Verbindungszustand die Fehlerwiederherstellung schwierig, während die sessionsspezifische Natur vorbereiteter Anweisungen deren Verwendung in Verbindungspools einschränkt. Der Autor schlägt Verbesserungen vor, die sich am Redis-Protokoll orientieren, wie z. B. eine explizite Konfigurationsphase, Idempotenzschlüssel und global gültige Bezeichner für vorbereitete Anweisungen. Diese Änderungen würden die Entwicklungsworkflows vereinfachen und die Zuverlässigkeit von Datenbankclients verbessern, was zu einer besseren Entwicklererfahrung und benutzerfreundlicheren Datenbanken führt.

Mehr lesen
Entwicklung

HTTP/2: Warum es in Ruby HTTP-Servern keine große Rolle spielt

2025-02-25

Dieser Beitrag behandelt die Relevanz von HTTP/2-Unterstützung in Ruby HTTP-Servern wie Puma. Der Autor argumentiert, dass der Hauptvorteil von HTTP/2 – Multiplexing für schnellere Seitenladezeiten – zwar im Internet erheblich ist, aber in einem LAN wenig Nutzen bietet. Geringe Latenz und langlebige Verbindungen in einem LAN minimieren die Auswirkungen des TCP Slow Start. Darüber hinaus erwies sich die Server-Push-Funktion von HTTP/2 als nachteilig und wurde durch die elegantere 103 Early Hints ersetzt. Der Autor empfiehlt, die Behandlung von HTTP/2 Load Balancern oder Reverse Proxies zu überlassen, um die Bereitstellung und Wartung des Anwendungsservers zu vereinfachen.

Mehr lesen
Entwicklung Netzwerk-Performance

Der Mythos der E/A-gebundenen Rails-Anwendung

2025-01-25

Es ist weit verbreitet, dass Rails-Anwendungen inhärent E/A-gebunden sind, wobei die Datenbank der Hauptleistungsengpass ist und die Ruby-Performance weniger wichtig ist. Dieser Beitrag widerlegt diese Annahme. Obwohl die Datenbank tatsächlich ein Skalierungsproblem darstellt, argumentiert der Autor, dass dies nicht bedeutet, dass die Anwendung den größten Teil ihrer Zeit mit dem Warten auf E/A verbringt. Die Analyse der Leistungsverbesserungen von YJIT und gängiger Leistungsprobleme (wie fehlende Datenbankindizes) deutet darauf hin, dass viele Rails-Anwendungen tatsächlich CPU-gebunden sind. Der Beitrag hebt die Verwechslung zwischen CPU-Starvation und E/A-Wartezeiten hervor und betont, dass die Wahl des richtigen Ausführungsmodells (asynchron, mehrthreaded oder prozessbasiert) vom E/A-CPU-Verhältnis der Anwendung abhängt. Der Autor plädiert für mehr Aufmerksamkeit auf die Ruby-Performance und weist auf Optimierungsmöglichkeiten innerhalb von Rails selbst hin.

Mehr lesen
Entwicklung

Optimierung von Rubys JSON: Eine Geschichte von Stack-Allokation und Inlining

2025-01-02

Dieser Blogbeitrag, Teil vier einer Serie zur Optimierung der JSON-Performance in Ruby, beschreibt die Reise des Autors, die Geschwindigkeit der JSON-Serialisierung in Ruby zu verbessern. Durch sorgfältige Mikro-Benchmarks und Profilerstellung untersucht der Autor Stack-Allokation und Inlining-Techniken. Durch die Verlagerung der Pufferallokation vom Heap auf den Stack und die strategische Verwendung von Inlining werden signifikante Performance-Verbesserungen erzielt. Der Artikel hebt jedoch die Wichtigkeit hervor, Verbesserungen bei Mikro-Benchmarks mit der Performance realer Anwendungen in Einklang zu bringen, und zeigt ein Beispiel, bei dem die Optimierung größere Datensätze negativ beeinflusst hat.

Mehr lesen
Entwicklung

Optimierung von Rubys JSON: Teil 1

2024-12-18

Dieser Blogbeitrag beschreibt, wie der Autor das Ruby JSON-Gem optimiert hat, um es zu einem der schnellsten JSON-Parser und -Generatoren zu machen. Anstatt komplexer Techniken wurden einfache Optimierungen basierend auf Profiling angewendet, wie z. B. das Vermeiden redundanter Prüfungen, das Priorisieren günstigerer Bedingungen, das Reduzieren der Einrichtungskosten und die Verwendung von Lookup-Tabellen. Diese Verbesserungen gelten sowohl für C- als auch für Ruby-Code. Die Optimierungen haben die Leistung des JSON-Gems deutlich verbessert und es mit Alternativen wie `oj` wettbewerbsfähig gemacht, wodurch der Bedarf an Monkey Patching reduziert und Stabilitäts- und Kompatibilitätsprobleme im Zusammenhang mit `oj` behoben wurden.

Mehr lesen