ผมเปลี่ยนจาก JSON มาใช้รูปแบบ Binary ที่สร้างขึ้นเองใน PHP
เราต้องการวิธีที่ดีกว่าในการจัดเก็บ rich text สำหรับแอปและเว็บไซต์ของเรา
ในตอนแรก เราจัดเก็บ HTML แบบดิบ (raw HTML) ไว้ในฐานข้อมูล ต่อมาเราได้เปลี่ยนมาใช้ JSON เพื่อแยกส่วนการแก้ไขออกจากส่วนการแสดงผล JSON ใช้งานได้ดีอยู่พักหนึ่ง แต่เมื่อเราขยายตัวขึ้น มันก็เริ่มสร้างปัญหาใหม่ๆ ตามมา
JSON เริ่มทำงานช้าเกินไปสำหรับความต้องการของเรา
เมื่อเราต้องการค้นหาและอัปเดตลิงก์เก่าๆ เราต้องทำการ parse และสร้าง array ทั้งหมดขึ้นมาใหม่ กระบวนการนี้ทั้งช้าและไม่มีประสิทธิภาพ เราจึงต้องการรูปแบบที่ช่วยให้การจัดการข้อมูลและการทำ streaming ทำได้รวดเร็วยิ่งขึ้น
ผมจึงตัดสินใจสร้างรูปแบบ binary ที่กำหนดขึ้นเองโดยใช้ PHP
นักพัฒนาหลายคนคิดว่า PHP ไม่ได้ถูกสร้างมาเพื่อการจัดการ byte ในระดับต่ำ (low-level) อย่างไรก็ตาม PHP มีฟังก์ชันในตัวสำหรับเรื่องนี้:
pack(): แปลงตัวเลขหรือสตริงให้เป็น raw bytesunpack(): แปลง bytes เหล่านั้นกลับมาเป็นตัวเลขหรือสตริง
ผมเลิกใช้การจัดการสตริงแบบ multibyte แต่หันไปเน้นการอ่านข้อมูลเป็นส่วนๆ (chunks) ของ bytes แทน ตัวอย่างเช่น unsigned 64-bit integer จะต้องใช้พื้นที่ 8 bytes พอดี ความแม่นยำคือหัวใจสำคัญเมื่อต้องทำงานกับข้อมูล binary
ผมยังได้เปลี่ยนวิธีการจัดโครงสร้างข้อมูลด้วย
คนส่วนใหญ่มักพยายามเก็บเอกสารไว้ในโครงสร้างแบบต้นไม้ที่มีการซ้อนกันหลายชั้น (deep, nested tree structure) ซึ่งมักจะเป็นข้อผิดพลาด ผมเปลี่ยนมาใช้รายการแบบเรียบ (flat list) ขององค์ประกอบต่างๆ เช่น ข้อความ, แท็ก และรายการ โดยใช้โครงสร้างต้นไม้แบบ offset ง่ายๆ ในการสร้าง HTML กลับคืนมา วิธีนี้ช่วยให้งานอย่างการค้นหาลิงก์ทั้งหมดหรือการลบ HTML (stripping HTML) ทำได้อย่างรวดเร็วมาก
ผลลัพธ์จากการรัน 10,000 รอบ แสดงให้เห็นผู้ชนะที่ชัดเจน:
การเข้ารหัส JSON แบบเก่า: 2.18 วินาที การถอดรหัส JSON แบบเก่า: 0.86 วินาที
การเข้ารหัส Binary แบบใหม่: 1.19 วินาที การถอดรหัส Binary แบบใหม่: 0.67 วินาที
รูปแบบใหม่ทำงานได้เร็วกว่าทั้งในการเข้ารหัสและการถอดรหัส
รูปแบบ binary มีขนาดใหญ่กว่า JSON หรือ HTML โดยใช้พื้นที่มากกว่า JSON ประมาณสองเท่า แต่เนื่องจากเราใช้การประมวลผลฝั่งเซิร์ฟเวอร์ (server-side rendering) การเพิ่มขึ้นของพื้นที่จัดเก็บนี้จึงไม่ส่งผลกระทบต่อประสิทธิภาพการทำงานของเรา
การแลกเปลี่ยนนี้ถือว่าคุ้มค่า เพราะตอนนี้เราสามารถเปลี่ยนลิงก์และทำความสะอาด HTML ได้ด้วยฟังก์ชันที่เรียบง่ายและรวดเร็ว
หากคุณสร้างรูปแบบขึ้นมาเอง ควรเขียนข้อกำหนด (specification) ให้ชัดเจน เพราะคุณจะต้องกลับมาใช้มันเมื่อต้องกลับมาดูโค้ดในภายหลัง
ที่มา: https://dev.to/tomj/i-replaced-json-with-a-custom-binary-format-in-php-mok