Ho sostituito JSON con un formato binario personalizzato in PHP
Abbiamo bisogno di memorizzare testo formattato (rich text) per app web e mobile.
Per anni abbiamo utilizzato HTML puro nel nostro database. Successivamente, siamo passati a JSON per separare la fase di editing da quella di stampa.
JSON è diventato un problema con la crescita dei dati. Per modificare un singolo link, dovevamo analizzare (parse), ricostruire e convertire in stringa l'intero array. Questo processo era lento e inefficiente.
Ho deciso di creare un formato binario personalizzato utilizzando PHP.
Ecco perché ho effettuato il passaggio:
- Velocità: il parsing e la ricerca sono diventati molto più veloci.
- Controllo: posso manipolare byte specifici senza caricare tutto in memoria.
- Struttura: sono passato da un albero annidato a una lista piatta di elementi.
La maggior parte delle operazioni sul testo formattato non richiede un albero complesso. Spesso è sufficiente trovare del testo o dei tag specifici. Una struttura piatta di elementi con un semplice albero di offset funziona meglio.
PHP non è un linguaggio di basso livello. Non è ottimizzato per la manipolazione dei byte come Zig o C. Tuttavia, PHP ha gli strumenti giusti:
pack()trasforma numeri o stringhe in byte grezzi.unpack()trasforma quei byte nuovamente in dati utilizzabili.
Ho smesso di usare le funzioni per stringhe multibyte. Invece, leggo blocchi specifici di byte. Ad esempio, un intero a 64 bit senza segno richiede esattamente 8 byte.
I risultati dopo 10.000 cicli:
Vecchia codifica JSON: 2,18s Vecchia decodifica JSON: 0,86s Nuova codifica binaria: 1,19s Nuova decodifica binaria: 0,67s
Il formato binario è più veloce. È anche più grande. È il doppio di JSON e il triplo di HTML. Poiché utilizziamo il rendering lato server, questo non è un problema per noi.
Se crei un formato personalizzato, segui una regola: scrivi una specifica. Documenta chiaramente il tuo formato. Te ne pentirai se non lo farai.
Ci è voluta una settimana di lavoro. Ne è valsa la pena.
Fonte: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok