จริง ๆ แล้วไม่จำเป็นต้องมีทางเลือกอื่น
ruby/json ช้ากว่า oj เล็กน้อย แต่ความต่างไม่ได้มากนัก
oj ได้รับความนิยมเพราะประสิทธิภาพ แต่ก็อาจก่อให้เกิดปัญหาได้หลายอย่าง
- หนึ่งในปัญหาของ
oj คือปัญหาด้านความปลอดภัยที่เกิดจากการ monkey patch ผ่าน Oj.mimic_JSON
ความรับผิดชอบของ monkey patch
Oj.mimic_JSON และ Oj.optimize_rails แทนที่ implementation ของ JSON ที่มีประสิทธิภาพน้อยกว่า แต่ก็อาจทำให้เกิดปัญหาได้
- ตัวอย่างเช่น มันอาจเพิกเฉยต่อ option
script_safe จนทำให้เสี่ยงต่อการโจมตีแบบ XSS
- การทำ monkey patch ต้องทำอย่างระมัดระวัง และต้องรับมืออย่างปลอดภัยตามการเปลี่ยนแปลงของ API
ความไม่เสถียร
oj เป็นหนึ่งในสาเหตุหลักของการที่ Ruby crash ในระบบ production ขนาดใหญ่
oj มีการพัฒนาอย่างคึกคักมาก จึงมักเกิด crash ใหม่ ๆ อยู่บ่อยครั้ง
- ใน codebase ของ
oj มี dirty hack ที่ยากจะไว้วางใจอยู่
งานพื้นฐาน
- มีเป้าหมายจะปรับปรุง
ruby/json ให้มีประสิทธิภาพใกล้เคียง oj เพื่อลดความจำเป็นของ monkey patch
- มีการตั้งค่า benchmark และใช้ C profiler เพื่อวิเคราะห์ประสิทธิภาพ
หลีกเลี่ยงการตรวจซ้ำ
- ปรับปรุงประสิทธิภาพใน benchmark ของ
JSON.dump โดยหลีกเลี่ยงการตรวจ UTF-8 ซ้ำซ้อน
- ตัดงานซ้ำซ้อนของ
rb_enc_str_asciionly_p และ isLegalUTF8 ออก ทำให้ประสิทธิภาพดีขึ้น 3%
ตรวจเงื่อนไขที่ถูกกว่าและมีโอกาสเป็นจริงมากกว่าก่อน
- ปรับเงื่อนไขในฟังก์ชัน
fbuffer_inc_capa สำหรับตรวจว่ามีการจัดสรรบัฟเฟอร์ไว้แล้วหรือไม่ ส่งผลให้ประสิทธิภาพดีขึ้น 15%
ลดต้นทุนการตั้งค่า
- ลดต้นทุนการตั้งค่าของ
ruby/json ทำให้ประสิทธิภาพในไมโครบेंช์มาร์กดีขึ้นอย่างมาก
หลีกเลี่ยงการไล่ตามพอยน์เตอร์
- เอาการเรียก
rb_enc_get ออก ทำให้ประสิทธิภาพดีขึ้น 8%
ตาราง lookup
- ใช้ตาราง lookup เพื่อเพิ่มประสิทธิภาพของการ dump สตริง JSON ได้ 30%
โปรดติดตามตอนต่อไป
- ยังมีการปรับแต่งเพิ่มเติมอีก แต่จะพูดถึงในบทความถัดไป
1 ความคิดเห็น
ความคิดเห็นใน Hacker News
การใช้ jbuilder ซึ่งเป็นค่าเริ่มต้นของ Rails เป็นหนึ่งในปัจจัยที่ทำให้การเรนเดอร์ JSON ช้าลง
สงสัยว่ามีข้อมูลหรือไม่ว่าเวอร์ชันใหม่นี้ใช้เวลาเท่าไรในการแยกวิเคราะห์/เข้ารหัส Twitter JSON dump
บทความเกี่ยวกับหัวข้อนี้เข้าใจง่ายมาก และทำให้อยากลอง benchmark และปรับแต่งโค้ด Ruby
เป็นบทความและผลงานที่ยอดเยี่ยม
เป็นบทความที่น่าสนใจมาก
ชื่นชอบผลงานของ byroot มาก
คำแนะนำเรื่อง C profiler ยอดเยี่ยมมาก
ประทับใจกับเทคนิคด้านประสิทธิภาพที่เรียกว่า "lookup table" ซึ่งใช้ใน PR ของ Mame
String#each_codepointแทนString#each_charสามารถช่วยลดภาระของ GC ได้แชร์ตัวอย่างการปรับปรุงประสิทธิภาพเพิ่มเติมใน codebase ของตัวเอง
Array#packเพื่อรวบรวม code point และแปลงเป็นStringบน CPU สมัยใหม่ คำใบ้การทำนายสาขาไม่มีประโยชน์
สงสัยว่า Ruby JSON ใช้ intrinsic หรือไม่