3 คะแนน โดย GN⁺ 2023-07-04 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • Arena หรือ region เป็นเทคนิคที่เรียบง่ายและมีประสิทธิภาพสำหรับคอมไพเลอร์และระบบที่คล้ายคอมไพเลอร์
  • การใช้ arena เพื่อทำให้ abstract syntax tree (AST) แบนราบสามารถช่วยเพิ่มประสิทธิภาพและความสะดวกในการใช้งานได้
  • การทำให้แบนราบหมายถึงการแพ็กโหนด AST ลงในอาร์เรย์เดียว และใช้อินเด็กซ์ของอาร์เรย์แทนพอยน์เตอร์
  • AST ที่ถูกทำให้แบนราบมีข้อดี เช่น locality ที่ดีขึ้น, reference ที่เล็กลง, และต้นทุนการจัดสรรกับการคืนหน่วยความจำที่ต่ำลง
  • AST ที่ถูกทำให้แบนราบสามารถทำให้การจัดการหน่วยความจำง่ายขึ้น และเอื้อให้การ deduplication ทำได้สะดวก
  • ผลลัพธ์ด้านประสิทธิภาพแสดงให้เห็นว่าเวอร์ชันอินเทอร์พรีเตอร์แบบแบนราบอาจเร็วกว่าเวอร์ชันปกติได้ถึง 2.4 เท่า
  • สามารถใช้ประโยชน์จากการแทน AST แบบแบนราบเพื่อตัด recursion ออก และใช้การสแกนเชิงเส้นเพื่อเพิ่มประสิทธิภาพได้อีก
  • บทความนี้กล่าวถึงการเพิ่มประสิทธิภาพที่ทำได้จากการทำให้โครงสร้างข้อมูลแบนราบในอินเทอร์พรีเตอร์ของภาษาโปรแกรม
  • นอกจากนี้ อินเทอร์พรีเตอร์แบบแบนราบยังแสดงการปรับปรุงประสิทธิภาพ 8.2% เมื่อเทียบกับอินเทอร์พรีเตอร์แบบ recursive โดยทำเวลาได้ 1.2 วินาที เทียบกับ 1.3 วินาที
  • เทคนิคนี้แทบจะเป็นการคิดค้นแนวคิดของ bytecode interpreter ขึ้นมาใหม่ โดยใช้โครงสร้าง Expr เป็นคำสั่ง bytecode
  • มีการกล่าวถึงบทความและโครงการอื่น ๆ ที่เกี่ยวข้องกับการทำให้โครงสร้างข้อมูลแบนราบ เช่น LuaJIT, Sorbet type checker และ Oil shell
  • แนวคิดคล้ายกันเกี่ยวกับการทำให้แบนราบและการปรับ locality ยังปรากฏในโดเมนอย่างวิดีโอเกม, การประมวลผลข้อมูลที่ถูก serialize, data-oriented design และ entity-component system
  • บทความนี้แนะนำให้ไปอ่านโพสต์ของ Inanna Malick ที่นำเทคนิคเดียวกันไปใช้กับภาษา "เครื่องคิดเลข" แบบของเล่นที่เขียนด้วย Rust
  • มีการอภิปรายถึงข้อจำกัดของการใช้เทคนิคนี้ใน Rust โดยมีข้อจำกัดว่าไม่สามารถฝัง Expr อื่นแบบ inline ไว้ภายในโครงสร้าง Expr ได้
  • การเปรียบเทียบประสิทธิภาพดำเนินการบน MacBook Pro ที่ใช้โปรเซสเซอร์ M1 Max และหน่วยความจำ 32GB โดยรัน macOS 13.3.1 และ Rust 1.69.0

1 ความคิดเห็น

 
GN⁺ 2023-07-04
ความเห็นจาก Hacker News
  • Blender ใช้รูปแบบเดียวกันทั้งบนดิสก์และในหน่วยความจำ เพื่อให้การโหลดและบันทึกไฟล์รวดเร็วและไม่สูญเสียข้อมูล
  • pulldown-cmark ใช้ AST แบบแบนเพื่อการพาร์สอินไลน์มาร์กอัปอย่างมีประสิทธิภาพ
  • การแทน AST แบบแบนทำให้สามารถแปลงต้นไม้ได้ในเวลา O(1) โดยไม่ขึ้นกับจำนวนโหนดหรือความลึกของสแตก
  • ประสิทธิภาพของ pulldown-cmark โดดเด่นเมื่อเทียบกับพาร์สเซอร์ CommonMark อื่น ๆ
  • Warren Abstract Machine (WAM) ใช้การแทนแบบแบนสำหรับ Prolog บนฮีป
  • การทำ AST ให้แบนเป็นแนวคิดที่มีการใช้งานอยู่แล้วในภาษาอย่าง Lisp
  • การเก็บโหนดไว้ในอาร์เรย์ที่ปรับขนาดได้อาจก่อให้เกิดปัญหาการจัดสรรหน่วยความจำ แต่บรรเทาได้ด้วยการพูลเป็นบล็อกขนาดเพจ
  • ต้องระมัดระวังว่าการแทนโหนด AST ในโค้ดเป็นอย่างไร และควรหลีกเลี่ยง padding ที่ไม่จำเป็น
  • การใช้อินเด็กซ์แทนพอยน์เตอร์ช่วยให้ได้โค้ดที่เล็กกว่าและเร็วกว่า
  • สามารถใช้ตัวจัดสรรหน่วยความจำแบบกำหนดเองที่มีประโยชน์ในบางสถานการณ์เพื่อทำหน่วยความจำแบบแบน
  • มีการใช้โครงสร้าง AST ที่กระชับเพื่อสร้างพาร์สเซอร์และอินเทอร์พรีเตอร์ JavaScript สำหรับสภาพแวดล้อมที่มีข้อจำกัดด้านหน่วยความจำ