𝗭𝗮𝘀𝘁𝗮𝗽𝗶𝗹𝗲𝗺 𝗝𝗦𝗢𝗡 𝘄ł𝗮𝘀𝗻𝘆𝗺 𝗳𝗼𝗿𝗺𝗮𝘁𝗲𝗺 𝗯𝗶𝗻𝗮𝗿𝗻𝘆𝗺 𝘄 𝗣𝗛𝗣

Musimy przechowywać tekst bogato formatowany (rich text) dla aplikacji webowych i mobilnych.

Przez lata w naszej bazie danych używaliśmy czystego HTML-a. Później przeszliśmy na JSON, aby oddzielić edycję od drukowania.

JSON stał się problemem wraz ze wzrostem ilości danych. Aby zmienić pojedynczy link, musieliśmy parsująć, przebudowywać i zamieniać na ciąg znaków (stringify) całą tablicę. Proces ten był powolny i nieefektywny.

Postanowiłem stworzyć własny format binarny przy użyciu PHP.

Oto dlaczego zdecydowałem się na tę zmianę:

  • Szybkość: Parsowanie i przeszukiwanie stały się znacznie szybsze.
  • Kontrola: Mogę manipulować konkretnymi bajtami bez ładowania wszystkiego do pamięci.
  • Struktura: Przeszedłem z zagnieżdżonego drzewa na płaską listę elementów.

Większość zadań związanych z tekstem bogato formatowanym nie wymaga złożonego drzewa. Często wystarczy po prostu znaleźć tekst lub konkretne tagi. Płaska struktura elementów z prostym drzewem przesunięć (offsets) sprawdza się lepiej.

PHP nie jest językiem niskopoziomowym. Nie jest zoptymalizowany pod kątem manipulacji bajtami tak jak Zig czy C. Jednak PHP posiada odpowiednie narzędzia:

  • pack() zamienia liczby lub ciągi znaków na surowe bajty.
  • unpack() zamienia te bajty z powrotem na użyteczne dane.

Przestałem używać funkcji dla wielobajtowych ciągów znaków. Zamiast tego czytam konkretne fragmenty bajtów. Na przykład, 64-bitowa liczba całkowita bez znaku wymaga dokładnie 8 bajtów.

Wyniki po 10 000 pętli:

Stare kodowanie JSON: 2,18 s Stare dekodowanie JSON: 0,86 s Nowe kodowanie binarne: 1,19 s Nowe dekodowanie binarne: 0,67 s

Format binarny jest szybszy. Jest jednak również większy. Ma 2-krotnie większy rozmiar niż JSON i 3-krotnie większy niż HTML. Ponieważ korzystamy z renderowania po stronie serwera, nie ma to dla nas znaczenia.

Jeśli budujesz własny format, trzymaj się jednej zasady: napisz specyfikację. Udokumentuj swój format w sposób jasny. Jeśli tego nie zrobisz, będziesz żałować.

Zajęło to tydzień pracy. Było warto.

Źródło: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok