Tag: optimization

5 รายการ

Blog

ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กยืนข้างถังไม้ใบใหญ่ที่รอเทครั้งเดียว ข้าง ๆ มีถ้วยจิ๋วสีอำพันใบเล็กวางคว่ำไว้ไม่ได้ใช้ และมีสมุดจดผลวางเปิดอยู่
zigperformanceoptimization

Zig Optimization #5: buffer เดียวเปลี่ยน 1,173 ms เป็น 3 ms และของที่แก้แล้วไม่ต่าง

บทปิดของชุด optimization — กราฟขนาด buffer ที่ต่างกัน 375 เท่า, ต้นทุนของ format ที่ต้องแยกให้ออกจากต้นทุน syscall และรวมทุกเคสที่ผมวัดแล้วพบว่าแก้ไปก็ไม่ดีขึ้น ซึ่งมีค่าพอ ๆ กับเคสที่ดีขึ้น

พี่โชว์
ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กหยิบของจากรางยาวที่เรียงเป็นแถวเดียวต่อเนื่อง ขณะที่อีกฝั่งของโต๊ะมีของวางกระจายห่างกันพร้อมเส้นด้ายสีอำพันโยงไปมาระหว่างชิ้น
zigperformanceoptimization

Zig Optimization #4: pointer chasing ช้ากว่า array 247 เท่า แต่ SoA ชนะแค่ 9%

วัดการจัดวางข้อมูลบน 2 ล้านแถว — struct-of-arrays ชนะน้อยกว่าที่คนเล่ากันเยอะ, การเปลี่ยน usize เป็น u32 ไม่ได้ช่วยเลยแม้แต่นิดเดียว แต่การเดิน linked list ที่ node กระจัดกระจายช้ากว่า array 247 เท่า

พี่โชว์
ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กแขวนป้ายชื่อยาวไว้บนตะขอเพียงครั้งเดียว แล้วหยิบเหรียญเลขเล็ก ๆ สีอำพันไปใช้แทนในการนับที่กระดานข้าง ๆ
zigperformanceoptimization

Zig Optimization #3: เลิก copy ข้อความ และใช้ hash map ให้ถูกวิธี

วัดจริงบนงานนับความถี่ 200,000 ครั้ง — การสร้างข้อความใหม่ทุกรอบช้ากว่า interning 4 เท่า, contains+get+put ช้ากว่า getOrPut เกือบ 3 เท่า และการแปลง key เป็น u32 handle เร็วกว่าทุกวิธี 40 เท่า พร้อมผลตามความยาว key ที่ 16, 64 และ 256 ไบต์

พี่โชว์
ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กยกลังไม้ใบใหญ่ใบเดียวมาวางบนโต๊ะ แทนที่จะหยิบกล่องเล็กทีละใบจากกองที่เรียงยาวอยู่ด้านหลัง ลังใบใหญ่มีป้ายสีอำพันติดอยู่
zigperformancememory-management

Zig Optimization #2: การขอหน่วยความจำสองแสนครั้ง เหลือสองครั้ง

วัดจริงว่านิสัยขอหน่วยความจำที่ติดมาจาก Java, Go และ Python แพงแค่ไหนใน Zig — create ในลูปช้ากว่า arena 3 เท่า, การจองล่วงหน้าลดการขยายจากยี่สิบกว่ารอบเหลือศูนย์ และเคสที่ MemoryPool กลับไม่ชนะ arena เลยทั้งที่ทฤษฎีบอกว่าควรชนะ

พี่โชว์
ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กปรับตุ้มน้ำหนักบนตาชั่งสองแขนให้สมดุลก่อนใช้งาน มีตุ้มมาตรฐานสีอำพันวางอยู่บนจานข้างหนึ่ง สมุดจดวางเปิดอยู่ข้าง ๆ
zigperformancebenchmarking

Zig Optimization #1: ก่อนจะปรับให้เร็ว ต้องวัดให้ถูกก่อน

std.time.Timer หายไปจาก Zig 0.16 แล้ว และการเทียบ Debug กับ Release ตรง ๆ ให้ตัวเลขที่เกินจริงหกเท่า เพราะ init.gpa สลับ allocator ตาม build mode — บทนี้สร้าง harness ที่ใช้ได้จริงและพิสูจน์ว่าตัวเลขที่คนแชร์กันหลอกตรงไหน

พี่โชว์