Tôi đã thay thế JSON bằng một định dạng nhị phân tùy chỉnh trong PHP

Chúng tôi cần lưu trữ rich text cho các ứng dụng web và di động.

Trong nhiều năm, chúng tôi đã sử dụng HTML thuần trong cơ sở dữ liệu. Sau đó, chúng tôi chuyển sang JSON để tách biệt việc chỉnh sửa khỏi việc in ấn.

JSON đã trở thành một vấn đề khi dữ liệu của chúng tôi tăng lên. Để thay đổi một liên kết duy nhất, chúng tôi phải parse, xây dựng lại và stringify toàn bộ mảng. Quá trình này rất chậm và kém hiệu quả.

Tôi đã quyết định xây dựng một định dạng nhị phân tùy chỉnh bằng PHP.

Đây là lý do tại sao tôi thực hiện sự thay đổi này:

  • Tốc độ: Việc parse và tìm kiếm trở nên nhanh hơn nhiều.
  • Kiểm soát: Tôi có thể thao tác với các byte cụ thể mà không cần tải mọi thứ vào bộ nhớ.
  • Cấu trúc: Tôi đã chuyển từ một cây phân cấp (nested tree) sang một danh sách phẳng các phần tử.

Hầu hết các tác vụ rich text không cần một cấu trúc cây phức tạp. Bạn thường chỉ cần tìm văn bản hoặc các thẻ cụ thể. Một cấu trúc phẳng gồm các phần tử với một cây các offset đơn giản sẽ hoạt động hiệu quả hơn.

PHP không phải là một ngôn ngữ cấp thấp. Nó không được tối ưu hóa để thao tác byte như Zig hay C. Tuy nhiên, PHP có các công cụ phù hợp:

  • pack() chuyển đổi các số hoặc chuỗi thành các byte thô.
  • unpack() chuyển đổi các byte đó trở lại thành dữ liệu có thể sử dụng được.

Tôi đã ngừng sử dụng các hàm chuỗi đa byte (multibyte string functions). Thay vào đó, tôi đọc các khối byte cụ thể. Ví dụ, một số nguyên không dấu 64-bit yêu cầu chính xác 8 byte.

Kết quả sau 10.000 vòng lặp:

Mã hóa JSON cũ: 2,18s Giải mã JSON cũ: 0,86s Mã hóa Nhị phân mới: 1,19s Giải mã Nhị phân mới: 0,67s

Định dạng nhị phân nhanh hơn. Nó cũng lớn hơn. Nó có kích thước gấp 2 lần JSON và gấp 3 lần HTML. Vì chúng tôi sử dụng server-side rendering, điều này không quan trọng đối với chúng tôi.

Nếu bạn xây dựng một định dạng tùy chỉnh, hãy tuân theo một quy tắc: hãy viết một bản đặc tả (specification). Hãy lập tài liệu cho định dạng của bạn một cách rõ ràng. Bạn sẽ hối hận nếu không làm điều đó.

Tôi đã mất một tuần làm việc. Nó hoàn toàn xứng đáng.

Nguồn: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok