1 คะแนน โดย GN⁺ 2024-12-19 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

จริง ๆ แล้วไม่จำเป็นต้องมีทางเลือกอื่น

  • 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 ความคิดเห็น

 
GN⁺ 2024-12-19
ความคิดเห็นใน Hacker News
  • การใช้ jbuilder ซึ่งเป็นค่าเริ่มต้นของ Rails เป็นหนึ่งในปัจจัยที่ทำให้การเรนเดอร์ JSON ช้าลง

    • หากเรนเดอร์หลายส่วนด้วย jbuilder ความเร็วจะลดลง
  • สงสัยว่ามีข้อมูลหรือไม่ว่าเวอร์ชันใหม่นี้ใช้เวลาเท่าไรในการแยกวิเคราะห์/เข้ารหัส Twitter JSON dump

  • บทความเกี่ยวกับหัวข้อนี้เข้าใจง่ายมาก และทำให้อยากลอง benchmark และปรับแต่งโค้ด Ruby

    • ขอบคุณผู้เขียน
  • เป็นบทความและผลงานที่ยอดเยี่ยม

    • สงสัยว่าในอนาคตยังมีเหตุผลที่จะใช้ Oj อยู่หรือไม่
  • เป็นบทความที่น่าสนใจมาก

    • สงสัยว่าทำไมการปรับแต่งที่ไม่ได้จำกัดอยู่แค่ Ruby เช่น การใช้ lookup table สำหรับอักขระ escape ถึงไม่ใช้ไลบรารีที่มีอยู่แล้วอย่าง simdjson
  • ชื่นชอบผลงานของ byroot มาก

    • ประหลาดใจกับการมีส่วนร่วมและประสิทธิภาพการทำงานของเขาเสมอ
    • อยากมีส่วนร่วมกับงาน Ruby-core แต่หมดแรงจูงใจเพราะยังหาอะไรที่เหมาะกับทักษะของตัวเองไม่เจอ
    • หากคนที่ทำงานด้าน Ruby C เขียนบทความบ่อยขึ้น ก็น่าจะมีคนที่มีทักษะซึ่งช่วยพัฒนา Ruby ได้มากขึ้น
  • คำแนะนำเรื่อง C profiler ยอดเยี่ยมมาก

    • ทำให้อยากลองเพิ่มโค้ด C ลงใน Ruby gem แล้วกลับมาทดลองปรับแต่งอีกครั้ง
  • ประทับใจกับเทคนิคด้านประสิทธิภาพที่เรียกว่า "lookup table" ซึ่งใช้ใน PR ของ Mame

    • การใช้ String#each_codepoint แทน String#each_char สามารถช่วยลดภาระของ GC ได้
  • แชร์ตัวอย่างการปรับปรุงประสิทธิภาพเพิ่มเติมใน codebase ของตัวเอง

    • ใช้ Array#pack เพื่อรวบรวม code point และแปลงเป็น String
  • บน CPU สมัยใหม่ คำใบ้การทำนายสาขาไม่มีประโยชน์

  • สงสัยว่า Ruby JSON ใช้ intrinsic หรือไม่

    • รวมถึงสงสัยเรื่องความเข้ากันได้กับ JIT หลายแบบด้วย