if 4 พันล้านบรรทัด
- ระหว่างที่กำลังไล่อ่านโซเชียลมีเดียเมื่อไม่นานมานี้ ผู้เขียนเจอสกรีนช็อตนี้บนรถไฟ
- โค้ดนี้เป็นตัวอย่างที่สมบูรณ์แบบของ time-memory tradeoff
- จึงพยายามทำมันด้วยภาษา C เพื่อเพิ่มประสิทธิภาพ
โครงสร้างโค้ด
- เขียนโค้ดภาษา C สำหรับตรวจสอบว่าเป็นเลขคู่หรือเลขคี่
- คอมไพล์โดยปิดการทำ optimization
- ทำงานได้ถูกต้องกับตัวเลข 0 ถึง 10 แต่มีปัญหาเมื่อมากกว่านั้น
เมตาโปรแกรมมิง
- ใช้ Python ทำเมตาโปรแกรมมิงเพื่อสร้าง if statement
- สร้างโปรแกรมสำหรับตรวจสอบเลขคู่และเลขคี่ของจำนวนเต็ม 8 บิต
ขยายเป็น 16 บิต
- ขยายโปรแกรมด้วยวิธีเดียวกันสำหรับจำนวนเต็ม 16 บิต
- สร้างไฟล์ C ขนาดประมาณ 130k บรรทัดและคอมไพล์มัน
ความท้าทายของ 32 บิต
- พยายามขยายโปรแกรมไปยังจำนวนเต็ม 32 บิต
- สร้างไฟล์ C ขนาด 330GB ได้ แต่คอมไพเลอร์ล้มเหลวเพราะ heap space ไม่พอ
- และด้วยข้อจำกัดของฟอร์แมต Portable Executable จึงไม่สามารถจัดการไฟล์ที่ใหญ่กว่า 4GB ได้
เขียน machine code โดยตรง
- เขียนฟังก์ชัน
IsEven ด้วยภาษาแอสเซมบลี x86-64 โดยตรง
- ใช้ Python คอมไพล์ machine code ด้วยมือ
สร้างไฟล์ executable
- สร้างไฟล์ขนาด 40GB เพื่อระบุเลขคู่หรือเลขคี่สำหรับจำนวนเต็ม 32 บิตทั้งหมด
- แมปไฟล์เข้าหน่วยความจำและใช้ function pointer เพื่อรันโค้ด
แก้บั๊กสุดท้าย
- เปลี่ยนไปใช้ฟังก์ชัน
strtoul เพื่อแก้ปัญหาการ parse จำนวนเต็มแบบ unsigned
- โปรแกรมเร็วมาก และสามารถคืนผลลัพธ์ได้ภายใน 10 วินาทีแม้กับตัวเลขขนาดใหญ่
ความเห็นของ GN⁺
- ความสำคัญ: บทความนี้ช่วยให้เข้าใจแนวคิดพื้นฐานของการเขียนโปรแกรมอย่าง time-memory tradeoff ได้ดี อีกทั้งยังเป็นตัวอย่างที่ดีว่าการไม่ทำ optimization ส่งผลต่อประสิทธิภาพจริงอย่างไร
- ความน่าสนใจ: กระบวนการทดลองสำรวจความต่างด้านประสิทธิภาพระหว่างภาษาโปรแกรมและข้อจำกัดของคอมไพเลอร์นั้นน่าสนใจมาก โดยเฉพาะความพยายามเปรียบเทียบ Python กับภาษา C เพื่อเพิ่มประสิทธิภาพ
- บทเรียน: บทความนี้แสดงให้เห็นว่าแนวทางที่ดูไม่มีประสิทธิภาพในตอนแรก บางครั้งก็อาจมีประโยชน์จริงในการแก้ปัญหาที่ซับซ้อน และยังเน้นย้ำความสำคัญของการมองหาวิธีแก้แบบสร้างสรรค์ในวิทยาการคอมพิวเตอร์
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
สรุปความคิดเห็นแรก:
สรุปความคิดเห็นที่สอง:
for loopแบบง่าย ๆ แทนการใช้วิธีที่ซับซ้อนผ่านการสร้างโค้ดสรุปความคิดเห็นที่สาม:
is-evenและis-oddnpm installจะมีการดาวน์โหลดแพ็กเกจขนาด 40GBสรุปความคิดเห็นที่สี่:
สรุปความคิดเห็นที่ห้า:
สรุปความคิดเห็นที่หก:
สรุปความคิดเห็นที่เจ็ด:
สรุปความคิดเห็นที่แปด:
สรุปความคิดเห็นที่เก้า:
libdivideและแทนการหารจำนวนเต็ม 8 บิตด้วย lookup tableสรุปความคิดเห็นที่สิบ: