Ich habe JSON durch ein benutzerdefiniertes Binärformat in PHP ersetzt
Wir müssen Rich Text für Web- und mobile Apps speichern.
Jahrelang haben wir reines HTML in unserer Datenbank verwendet. Später sind wir zu JSON gewechselt, um das Bearbeiten vom Drucken zu trennen.
JSON wurde zum Problem, als unsere Datenmenge wuchs. Um nur einen einzigen Link zu ändern, mussten wir das gesamte Array parsen, neu aufbauen und stringifizieren. Dieser Prozess war langsam und ineffizient.
Ich habe mich entschieden, ein benutzerdefiniertes Binärformat mit PHP zu entwickeln.
Hier sind die Gründe für den Wechsel:
- Geschwindigkeit: Das Parsen und Suchen wurde wesentlich schneller.
- Kontrolle: Ich kann spezifische Bytes manipulieren, ohne alles in den Speicher laden zu müssen.
- Struktur: Ich bin von einem verschachtelten Baum zu einer flachen Liste von Elementen gewechselt.
Die meisten Rich-Text-Aufgaben benötigen keinen komplexen Baum. Oft muss man nur Text oder bestimmte Tags finden. Eine flache Struktur von Elementen mit einem einfachen Baum aus Offsets funktioniert besser.
PHP ist keine Low-Level-Sprache. Sie ist nicht für die Byte-Manipulation optimiert wie Zig oder C. PHP verfügt jedoch über die richtigen Werkzeuge:
pack()wandelt Zahlen oder Strings in Rohbytes um.unpack()wandelt diese Bytes wieder in nutzbare Daten um.
Ich habe aufgehört, Multibyte-String-Funktionen zu verwenden. Stattdessen lese ich spezifische Byte-Blöcke. Zum Beispiel benötigt ein vorzeichenloser 64-Bit-Integer genau 8 Bytes.
Die Ergebnisse nach 10.000 Durchläufen:
Altes JSON-Encoding: 2,18 s Altes JSON-Decoding: 0,86 s Neues Binär-Encoding: 1,19 s Neues Binär-Decoding: 0,67 s
Das Binärformat ist schneller. Es ist jedoch auch größer. Es ist doppelt so groß wie JSON und dreimal so groß wie HTML. Da wir Server-Side-Rendering verwenden, spielt das für uns keine Rolle.
Wenn Sie ein benutzerdefiniertes Format entwickeln, befolgen Sie eine Regel: Schreiben Sie eine Spezifikation. Dokumentieren Sie Ihr Format klar. Andernfalls werden Sie es bereuen.
Es hat eine Woche Arbeit gekostet. Es hat sich gelohnt.
Quelle: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok