Tag: performance

56 รายการ

Blog

นากการ์ตูนคุมทีมผู้ช่วยตัวจิ๋วจำนวนมากที่เรียงเป็นตารางบนการ์ดจอขนาดใหญ่ ข้างแก้วกาแฟ
javatornadovmgpu

TornadoVM 7.0 เพิ่ม TileContext API: อีกทางเขียนงาน GPU จากโค้ด Java

TornadoVM 7.0.0 เปิดตัว TileContext API ใหม่ ช่วยให้เขียนโค้ด Java แล้วรันบน GPU ได้ง่ายขึ้น เหมาะกับนักพัฒนา Java ที่ทำ ML inference, ประมวลผลภาพ หรือคำนวณการเงิน batch ใหญ่ๆ มาดูกันว่ามันช่วยเรื่องงานและเงินยังไง

น้องกาย
โต๊ะมิ้นต์มีวงล้อเครื่องยนต์โค้ดและแท่งสีเขียวอำพันสื่อถึง JIT ที่เร่งความเร็ว
pythonpython-3-15jit

Python 3.15 อัปเกรด JIT: เครื่องยนต์ใหม่ เร็วขึ้นแบบไม่ต้องเปลี่ยนพวงมาลัย

Python 3.15 มาพร้อม JIT compiler รุ่นใหม่ แรงขึ้น 7–12% บน Linux/Mac เครื่องผู้ใช้ไม่ต้องติดตั้งอะไรเพิ่ม เหมือนได้เครื่องยนต์รถใหม่แต่ขับเหมือนเดิม

น้องกาย
ขนมปังต้นฉบับหมุนเครื่องรีดผ้าผืนใหญ่ให้เป็นม้วนเล็กพร้อมปรับแรงกดด้วยคันโยก
buncompressionstreams

Bun 1.4.3 CompressionStream: ตั้งระดับบีบอัดให้ตรง latency budget

ใช้ CompressionStream level เลือกสมดุล CPU กับขนาดข้อมูล พร้อม Bun test แบบ round-trip โดยไม่พึ่งเครือข่าย

พี่โชว์
การ์ตูนนากสีมิ้นต์เป็นพนักงานร้านอาหาร กางโต๊ะเพิ่มทีละตัวในห้องโถงที่ยังว่างเมื่อมีลูกค้าเข้ามา ข้างผนังมีโต๊ะพับซ้อนรอใช้และมาตรวัดต้นทุนสีอำพัน
javajdk-28zgc

Java เสนอปรับแรมเองใน JDK 28 เริ่มไวขึ้น แต่บิลคลาวด์จะลดจริงไหม

ข้อเสนอ ZGC ช่วยแอป Java เริ่มไวและปรับหน่วยความจำตามงาน อธิบายผลทดลอง เงื่อนไขเปิดใช้ และสิ่งที่ทีมระบบกับคนคุมงบควรวัดก่อนหวังลดบิลคลาวด์

น้องกาย
กระรอกดินต้นฉบับรับเมล็ดทีละเมล็ดจากสายพานและหยุดเมื่อเต็มตะกร้า
gostringsiterator

Go strings.FieldsFuncSeq: แยก token แบบ iterator ไม่ต้องสร้าง slice ทั้งก้อน

ใช้ FieldsFuncSeq เดิน token ทีละค่า หยุดได้เร็ว และคัดลอกเฉพาะข้อมูลที่ต้องเก็บ พร้อม Go test

พี่โชว์
ปูสีส้มแดงต้นฉบับกำลังวางลูกบอลลงช่องว่างท้ายรางหน่วยความจำบนโต๊ะสีมิ้นต์
rustvecmemory

Rust Vec::spare_capacity_mut: เติม buffer ที่จองไว้โดยไม่สร้าง Vec ชั่วคราว

เรียนรู้ MaybeUninit, set_len invariant และ panic boundary ผ่านตัวอย่างเติมข้อมูลที่ทดสอบจริง

พี่โชว์
กระรอกดินต้นฉบับกำลังเติมชิ้นข้อมูลลงถาดพื้นที่ว่างของกล่องบัฟเฟอร์บนโต๊ะสว่าง
gogolangbytes

Go bytes.Buffer.AvailableBuffer: ต่อข้อมูลลงพื้นที่ว่างโดยลด allocation

ใช้ AvailableBuffer คู่ strconv.Append* อย่างถูกสัญญา พร้อมทดสอบการเขียน CSV, capacity และข้อห้ามเก็บ slice ข้าม Write

พี่โชว์
นากยืนที่รถเข็นอาหารริมทางพร้อมถาดวัตถุดิบที่เตรียมไว้ล่วงหน้า สื่อถึงการคอมไพล์โค้ดล่วงหน้าใน JEP 544
javajdk-28jep-544

Java เตรียมลดเวลารอหลังเปิดระบบ ด้วย JEP 544 ใน JDK 28

Java เตรียมเก็บโค้ดที่ปรับให้เร็วไว้ใช้ตั้งแต่เปิดระบบ อ่านว่าคนใช้บริการได้อะไร และทีม IT ต้องตรวจอะไร ก่อนเชื่อผลทดสอบหรือคาดหวังว่าค่าเครื่องจะลดลง

น้องกาย
นากกายกำลังเลื่อนตัวชี้ข้ามแถวกระเบื้องไปยังหมุดที่ถูกยกขึ้นถัดไป
javabitsetcollections

Java BitSet.nextSetBit: เดินเฉพาะตำแหน่งที่เปิดโดยไม่สแกนทุกช่อง

ใช้ BitSet.nextSetBit วน sparse flags พร้อมหลีกเลี่ยง off-by-one และแยก index set จาก business identity

พี่โชว์
กระรอกดินต้นฉบับกำลังขยายถาดชิ้นงานแล้วตัดพื้นที่สำรองส่วนเกินบนโต๊ะสีมิ้นต์
gogolangslices

Go slices.Grow กับ Clip: จองความจุให้พอ แล้วคืนส่วนเกินตรงขอบงาน

ใช้ slices.Grow ลดการขยาย backing array ซ้ำ และ slices.Clip ตัด capacity ก่อนส่งข้อมูลข้าม boundary พร้อม Go tests ที่รันจริง

พี่โชว์
โต๊ะมินต์มีขวดโหลวัตถุเล็กลงและเกจวัดประสิทธิภาพ JVM
javajdkperformance

Inside Java: JDK 27 เร็วขึ้นจากอะไร — Compact Headers และ G1 เป็นค่าเริ่มต้น

สรุปบทความ Inside.java 28 ก.ย. 2026 เรื่องผลงาน JDK 27: Compact Object Headers และ G1 default ทั่วเครื่อง, HashMap.putAll เร็วขึ้น, และคำแนะนำวัดผลตอนอัปเกรด

น้องกาย
กระต่ายต้นฉบับสังเกตลูกแก้วเคลื่อนบนรางเวลาที่เดินหน้าอย่างต่อเนื่อง
bunjavascriptperformance

Bun.nanoseconds: จับเวลาช่วงสั้นด้วยนาฬิกา monotonic

วัด elapsed time ของโค้ดด้วย Bun.nanoseconds โดยไม่สับสนกับเวลาปฏิทิน พร้อมตัวอย่างที่รันจริง

น้องกาย
งูขดตัวต้นฉบับกำลังหมุนกรอบมองเมล็ดชุดเดิมจากช่องเล็กให้เป็นช่องกว้างโดยไม่ย้ายเมล็ด
pythonmemoryviewbytes

Python memoryview.cast: เปลี่ยนมุมมอง bytes โดยไม่ copy

อ่านบัฟเฟอร์เดิมเป็นสมาชิกชนิดใหม่ด้วย memoryview.cast พร้อมตรวจ alignment เชิงรูปแบบและ byte order

พี่โชว์
กระรอกดินสีฟ้าอมเขียวต้นฉบับกำลังแบ่งเมล็ดเป็นแถวกว้างเท่ากันและเก็บเศษท้ายอย่างระมัดระวัง
gogolangsimd

Go 1.27 portable SIMD: เร่งงานเวกเตอร์โดยไม่ผูก CPU

อ่านข้อเสนอ simd แบบพกพาใน Go 1.27 ตั้งแต่ vector width, tail, emulation ถึงเกณฑ์วัดผลก่อนใช้จริง

พี่โชว์
กระรอกดินต้นฉบับกำลังสอดชิ้นงานผ่านแม่แบบรูปทรงก่อนวางลงถาดรับ
goreflectionperformance

Go reflect.TypeAssert: ตรวจชนิดจาก reflect.Value โดยไม่สร้าง interface กลาง

ย้ายจาก Value.Interface().(T) มาใช้ reflect.TypeAssert พร้อมอธิบายกรณีที่แก้ได้และขอบเขตของ reflection

พี่โชว์
ปูสีส้มแดงต้นฉบับกำลังปรับชิ้นงานบนสายพานแล้วคัดชิ้นที่ไม่ผ่านลงถาดข้างโต๊ะ
rustcollectionsperformance

Rust Vec::retain_mut: แก้ค่าและกรองสมาชิกในรอบเดียวโดยรักษาลำดับ

ใช้ retain_mut ทำ normalization ก่อนตัดค่าที่ไม่ผ่าน พร้อมเข้าใจ ownership, panic และต้นทุนการเลื่อนข้อมูล

พี่โชว์
กระรอกดินต้นฉบับกำลังรวมกุญแจรูปทรงเดียวกันจากหลายถาดเข้าสู่ช่องเก็บกลางเพียงช่องเดียว
gostdlibperformance

Go unique.Handle: ทำคีย์ซ้ำให้เหลือตัวแทนเดียวก่อนเก็บในแคช

ใช้ unique.Make สร้าง handle ที่เทียบได้เร็ว พร้อมขอบเขตเรื่องอายุข้อมูลและหน่วยความจำ

พี่โชว์
กระรอกดินต้นฉบับกำลังย้ายแถวข้อมูลจากถาดอ่านซ้ำไปยังกล่องเก็บถาวร
gocsvstreaming

Go CSV ReuseRecord: อ่านไวขึ้นโดยไม่เก็บ slice ที่ถูกใช้ซ้ำ

ใช้ encoding/csv.Reader.ReuseRecord กับ stream และคัดลอก record ก่อนเก็บข้ามรอบอ่าน

พี่โชว์
บัฟเฟอร์ bytearray บนโต๊ะมิ้นต์ ถูกดึงก้อน bytes ออกด้านขวาสีอำพัน
pythonbytearraystdlib

Python 3.15: bytearray.take_bytes — ดึง bytes ออกจากบัฟเฟอร์โดยไม่คัดลอกเกินจำเป็น

สรุป bytearray.take_bytes ใน Python 3.15 สำหรับพาร์สโปรโตคอล/บัฟเฟอร์เครือข่าย — คืน bytes แล้วตัดออกจาก bytearray

น้องกาย
อิกัวนาตัวเล็กต้นฉบับเลื่อนกรอบสีอำพันครอบก้อนข้อมูลสีเขียวทีละช่วงโดยไม่ยกก้อนออกจากราง
zigslicesiterator

Zig std.mem.window: ทำ Sliding Window โดยคืน Slice ไม่คัดลอกข้อมูล

ใช้ std.mem.window สร้าง moving window, chunk และ sampling พร้อมระวัง tail slice กับ size/advance ที่ห้ามเป็นศูนย์

พี่โชว์
กระรอกดินต้นฉบับคัดของชิ้นเล็กจากสายพานลงถาดเฉพาะขนาด ก่อนส่งก้อนใหญ่ไปอีกทาง
goruntimememory

Go 1.27 แยกทางด่วนให้ Allocation ก้อนเล็ก: เร็วขึ้นโดยไม่ต้องแก้โค้ด

เจาะกลไก size-specialized allocation ของ Go 1.27 ว่าทำไมก้อนต่ำกว่า 80 ไบต์เร็วขึ้น และจุดไหนยังควรลด allocation เอง

พี่โชว์
แท่งคะแนนบนโต๊ะมิ้นต์มีมงกุฎสีอำพันบนแท่งสูงสุดสามแท่ง
pythonheapqstdlib

heapq.nlargest / nsmallest: หยิบ Top-N โดยไม่ sort ทั้งก้อน

ใช้ heapq.nlargest และ nsmallest จาก docs.python.org ดึงค่าสูงสุด/ต่ำสุด n ตัว พร้อมตัวอย่างรันจริง

น้องกาย
นากกายชี้กระดานโน้ตซ้อนชั้นบนโต๊ะมิ้นต์
pythonstdlibperformance

Python lru_cache: จำผลคำนวณซ้ำให้ฟังก์ชันบริสุทธิ์เร็วขึ้น

อธิบาย functools.lru_cache แบบสั้น พร้อม unittest ที่พิสูจน์ว่าเรียกซ้ำไม่คำนวณใหม่

น้องกาย
นากต้นฉบับจัดกล่องโมดูลสีเขียวลงรถส่งของสามคันตามเส้นทางหน้าเว็บที่ต่างกัน
nextjsturbopackjavascript

Turbopack แบ่ง JavaScript Chunk อย่างไร: ปรับโหลดหน้าโดยไม่ไล่แตก Bundle แบบเดาสุ่ม

สรุปแนวคิด chunking จากทีม Next.js พร้อมวิธีวัด shared code, navigation cost และขอบเขตของ experimental controls

พี่โชว์
จรวดกระดาษมีหน้าตาลากกล่องคอมโพเนนต์จากสะพานเก่าไปเกาะ Astro ทีละกล่องบนพื้นสีครีม
astrogatsbyreact

ย้าย Gatsby ไป Astro ใน 9 วันโดยไม่เขียน React ใหม่: บทเรียนจาก Evil Martians

ถอดกลยุทธ์ migration ที่เก็บ React components เดิมไว้ ลด JavaScript ตอนโหลด 61% และค่อยปรับ hydration หลัง cutover

พี่โชว์
งูต้นฉบับเฝ้ากล่องผลลัพธ์ที่มีลูกศรวนกลับไปยังเครื่องคำนวณบนโต๊ะสีมิ้นต์
pythonfunctoolscaching

Python cached_property: คำนวณครั้งเดียว แต่อย่าลืมออกแบบจังหวะล้าง cache

เข้าใจการเขียนทับ การลบเพื่อคำนวณใหม่ ข้อจำกัดของ __dict__ และ race ที่ยังเกิดได้

พี่โชว์
นากกายจัดกล่องแคชสองใบบนโต๊ะมิ้นต์ ใบหนึ่งไม่จำกัดขนาด ใบหนึ่งมีช่อง LRU สีอำพัน
pythonstdlibfunctools

functools.cache กับ lru_cache: เมื่อไหร่ควรจำกัดขนาดแคช

เทียบ @cache กับ @lru_cache จากเอกสาร Python พร้อมตัวอย่างรันได้และเกณฑ์เลือกใช้

น้องกาย
งูสีมิ้นต์ต้นฉบับกำลังชี้ช่องว่างระหว่างก้อนหินที่เรียงขนาดบนโต๊ะสีครีม
pythonbisectalgorithms

Python bisect key=: ค้นช่วงในข้อมูลเรียงโดยไม่เรียก key ซ้ำเกินจำเป็น

ใช้ bisect_left กับ key อย่างถูกชนิด และเลือก precomputed keys หรือ cache เมื่อต้องค้นซ้ำบนข้อมูลเดิม

พี่โชว์
งูสีมิ้นต์ต้นฉบับกำลังนำลูกปัดจากรางเรียงสามสายเข้าสู่รางกลางบนโต๊ะสว่าง
pythonheapqstreaming

Python heapq.merge: รวม stream ที่เรียงแล้วโดยไม่กองทั้งหมดใน RAM

ใช้ heapq.merge รวมหลาย iterable แบบ lazy พร้อมเงื่อนไขข้อมูลต้องเรียงและผลต่อ memory เมื่อเทียบกับ sorted

พี่โชว์
นากสีมิ้นต์ต้นฉบับกำลังปรับกรอบตรวจการ์ดในสายพานรายการบนโต๊ะสว่าง
react-nativeflatlistperformance

React Native FlatList: ทำ viewability config ให้อ้างอิงคงที่

ลด callback สั่นและ error จากการเปลี่ยน viewabilityConfig ระหว่าง render ด้วย ref และแยกนโยบายการมองเห็นออกจาก UI state

พี่โชว์
ปูต้นฉบับกำลังใช้วงเวียนวัดริบบิ้นสีเขียวที่ถูกตัดเป็นช่วงบนโต๊ะสว่าง
ruststringsperformance

Rust 1.98: substr_range คืนช่วง byte ของ slice โดยไม่ค้นซ้ำ

ทำความเข้าใจ str::substr_range สำหรับเชื่อม string slice กลับสู่ตำแหน่งต้นฉบับ พร้อมข้อจำกัดเรื่อง provenance และ UTF-8

พี่โชว์
นากกายวางกล่องผลลัพธ์ซ้ำบนชั้นแคชขนาดจำกัดบนโต๊ะมิ้นต์
pythonstdlibfunctools

functools.lru_cache: จำผลคำนวณซ้ำโดยไม่ต้องเขียนแคชเอง

อธิบาย lru_cache จาก stdlib พร้อมตัวอย่างรันได้ ตารางเลือก maxsize และข้อควรระวังเรื่องอาร์กิวเมนต์ที่แฮชได้

น้องกาย
นากกายสีมิ้นต์กำลังเปิดกล่องสำรองเฉพาะเมื่อกล่องหลักว่างบนโต๊ะสว่าง
javaoptionalperformance

Java Optional: orElse สร้างค่าทิ้งได้ ส่วน orElseGet ทำเมื่อจำเป็น

เห็นผลของ eager กับ lazy fallback ชัด ๆ พร้อม assertion ที่กัน side effect เกิดทั้งที่มีค่าอยู่แล้ว

พี่โชว์
นากกายสีมิ้นต์กำลังย้ายม้วนแผนที่ source map จากลังใหญ่ไปกล่องเล็กบนโต๊ะทำงานสว่าง
react-nativemobileperformance

React Native 0.87: Metro ใช้แรมน้อยลงครึ่งหนึ่ง แต่ config เก่าต้องเก็บกวาด

แยกผลของ source map storage ออกจาก migration ของ config เพื่ออัป bundler โดยไม่ปนหลายความเสี่ยง

พี่โชว์
มาสคอตขนมปังกลมต้นฉบับกำลังตัดเชือก context ที่ผูกถุงข้อมูลกับนาฬิกาทรายบนโต๊ะสว่าง
bunjavascriptperformance

Bun 1.4.2 แก้ AsyncLocalStorage กัก context ไว้นานเกินงาน

แพตช์ regression ที่ค่าระดับ request ยังถูกอ้างถึงโดย timer และ promise พร้อม smoke test ก่อน rollout

พี่โชว์
ปูสีส้มแดงต้นฉบับกำลังเรียงเม็ดหินตัวเลขเชิงนามธรรมลงในรางบัฟเฟอร์บนโต๊ะมิ้นต์
rustperformancerelease

Rust 1.98 format_into: แปลงเลขเป็นข้อความโดยไม่ดึง crate เพิ่ม

รู้จัก NumBuffer และ format_into สำหรับ hot path พร้อมเหตุผลที่ไม่ควรแทน format! ทุกจุด

พี่โชว์
นากกายสีมิ้นต์มองเลนขนานหลายแถวบนโต๊ะมิ้นต์สว่าง
javajdkjep

JEP 537: Vector API รอบที่สิบสองใน JDK 27

สรุป JEP 537 ที่ re-incubate Vector API ใน JDK 27 โดยไม่เปลี่ยน API และอัปเดตไลบรารี SLEEF

น้องกาย
นากกายสีมิ้นต์ต่อสายสุ่มตัวอย่างเข้าขวดนาฬิกาทรายที่กำลังเดินบนโต๊ะมิ้นต์
pythonprofilingcpython

Python 3.15 Tachyon: โปรไฟล์แบบสุ่มตัวอย่างโดยไม่ฝังโค้ดในโปรเซส

สรุปโมดูล profiling.sampling ชื่อ Tachyon ใน Python 3.15 ที่แนบ PID ได้ สร้าง flame graph และเหมาะกับโปรดักชันเพราะโอเวอร์เฮดเกือบศูนย์

น้องกาย
ขนมปังกลมต้นฉบับกำลังปรับคันโยกให้สายพานงานสามเส้นเดินพร้อมกันบนโต๊ะสว่าง
bunjavascripttooling

Bun 1.4 รันหลาย Script พร้อมกัน: ใช้ --parallel โดยยังอ่าน Log รู้เรื่อง

จัดงาน build และ lint ที่เป็นอิสระให้รันพร้อมกันด้วย bun run --parallel พร้อมขอบเขตที่ควรกลับไปใช้ sequential

พี่โชว์
แฟ้มปิดสองใบและแฟ้มที่ถูกดึงเปิดด้วยแถบสีอำพันบนโต๊ะมิ้นต์
pythonpepperformance

lazy import ใน Python 3.15: เลื่อนโหลดโมดูลจนกว่าจะถูกใช้จริง

อธิบาย PEP 810 Explicit lazy imports ที่มากับสาย Python 3.15 เหมาะกับ CLI และแอปที่ import หนักตั้งแต่เปิดโปรแกรม

น้องกาย
ภาพวาดมาสคอตขนมปังกลมต้นฉบับใช้แว่นขยายส่องแถบกระดาษจากเครื่องที่ชี้กองงานหนักที่สุด
bunjavascripttypescript

Bun 1.4 อ่าน CPU Profile เป็น Markdown: หา Hot Function ก่อนเดา

ใช้ --cpu-prof-md สร้างรายงาน Markdown จากโปรแกรม TypeScript และอ่านสัดส่วน CPU เพื่อหา bottleneck อย่างมีหลักฐาน

น้องกาย
ภาพวาดปูสีส้มแดงต้นฉบับกำลังเลื่อนลูกแก้วสี่ลูกจากรางคำนวณต่อเนื่องไปยังรางคู่บนโต๊ะทำงานสว่าง
rustperformancefloating-point

Rust 1.98 เปิดทางคำนวณ Float แบบ Algebraic: เร็วขึ้นได้ แต่คำตอบอาจขยับ

เข้าใจเมธอด algebraic_* ใหม่ของ Rust 1.98 ว่าแลกความคงที่ของเลขทศนิยมกับโอกาส vectorize อย่างไร และงานแบบไหนไม่ควรใช้

น้องกาย
ภาพวาดแมวป่าหูพู่สีเขียวอมฟ้าตรวจสะพานแอปมือถือสามช่วง ได้แก่ภาพที่ค่อยชัด สายน้ำข้อมูล และรั้วจับเวลาการทำงาน
lynxjsmobilefrontend

Lynx 4 วิเคราะห์ก่อนอัปเกรด: Runtime CSS, Streaming Fetch และรั้วกัน JavaScript ค้าง

พี่โชว์คัดของสำคัญจาก Lynx 4 สำหรับทีม mobile ตั้งแต่ runtime CSS และ progressive image ถึง JS timeout guard พร้อมแผนทดลองที่วัดผลได้

พี่โชว์
ภาพวาดจรวดกระดาษมีใบหน้ากำลังส่งหน้ากระดาษผ่านสถานีตรวจแฮช โดยเก็บหน้าที่ไม่เปลี่ยนไว้ในช่องสีเขียว
astrostatic-sitebuild

Astro 7.2 Incremental Builds: เร่งเว็บใหญ่ด้วย cacheKey โดยไม่เสี่ยงหน้าเก่า

พี่โชว์อธิบายกลไก incremental static builds แบบทดลองของ Astro 7.2 และแผน rollout สำหรับเว็บบทความที่ต้องพิสูจน์ cache invalidation ก่อนเปิดใช้

พี่โชว์
ภาพวาดโทนมิ้นต์สว่าง อิกัวนาตัวเล็กผูกป้ายปลายทางอันสุดท้ายเข้ากับพัสดุที่ห่อเสร็จแล้วห้าชิ้นที่เรียงกันบนโต๊ะแพ็กของ ป้ายแต่ละอันรูปทรงต่างกัน อันที่กำลังผูกเป็นสีอำพัน
zigworkshopcli

Zig Workshop #6: 1 ล้านบรรทัดใน 62 มิลลิวินาที และส่งขึ้นทุกแพลตฟอร์ม

บทจบของ workshop zlog — เก็บข้อมูลแบบ struct-of-arrays เพื่อคำนวณ percentile, เทียบเวลา Debug กับ Release ที่ต่างกัน 14 เท่า, คอมไพล์ binary ให้ห้าแพลตฟอร์มจากเครื่องเดียว และ benchmark เทียบกับ awk และ Python บนไฟล์ 94 MB เดียวกันที่ reproduce ได้

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

Zig 0.16 บทที่ 9: เลือก allocator ให้ถูกงาน และของที่หายไปใน 0.16

สวนสัตว์ allocator ของ Zig 0.16 — arena ที่ทำให้โค้ดคืนหน่วยความจำหายไปเกือบหมด (วัดได้ว่าลดการขอจาก 50 ครั้งเหลือ 5), FixedBufferAllocator, MemoryPool, stackFallback พร้อมทางย้ายสู่ BufferFirstAllocator ใน 0.17, DebugAllocator vs smp_allocator และรายชื่อ allocator ที่ถูกลบทิ้งใน 0.16

พี่โชว์
ภาพวาดโทนเขียวเข้ม แถวสถานีเรียบง่ายหกจุดวางเรียงบนโต๊ะทำงาน ทุกจุดจมอยู่ในเงา ยกเว้นจุดเดียวที่มีหน้าปัดวัดขนาดใหญ่เกินตัวติดอยู่และมีไฟส่องสว่าง มีเส้นสีอำพันเส้นบางลากผ่านทุกจุดตั้งแต่ซ้ายสุดถึงขวาสุด
aiinferencehardware

Jalapeño ชิป Inference ของ OpenAI: ทำไม Latency กับไฟต้องวัดพร้อมกัน

อ่านผลทดสอบชิป Jalapeño แบบไม่หลงตัวเลข แยก prefill, decode, throughput และ performance per watt เพื่อมองผลต่อ AI agent จริง

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

พี่โชว์
ภาพกองบล็อกแคชโปร่งใสจำนวนมากถูกจัดให้แน่นเป็นก้อนเล็กลงบนแผนที่เครือข่ายสีเขียว สื่อถึงการลดหน่วยความจำของ DNS cache
rustperformancememory

Rust ลด RAM ให้ DNS Cache: บทเรียนจาก 250,000 ล้านรายการของ Cloudflare

แกะ 5 แนวคิดลด memory footprint จากระบบ DNS ของ Cloudflare พร้อมตัวอย่าง Rust ที่ทดสอบจริงว่าโครงสร้างแบบ growable กับ frozen layout ต่างกันอย่างไร

พี่โชว์
แผนภาพการย้ายทราฟฟิกจากระบบเดิมผ่าน proxy ไปยังระบบ Astro ใหม่ทีละ 1, 5, 15 และ 100 เปอร์เซ็นต์ พร้อมเส้นทาง fallback
astrocmsmigration

ย้ายบล็อกใหญ่ไป Astro/CMS ใหม่แบบไม่ลุ้นดวง: 6 ด่านจาก Cloudflare

สรุปบทเรียน Customer Zero, load test, cache หลายชั้น และ canary rollout จากการย้าย Cloudflare Blog ไป EmDash บน Astro โดยเริ่มจากความเสี่ยงก่อนเครื่องมือ

พี่โชว์
ภาพปกบทความอัปเกรด Astro 6 เป็น Astro 7 พร้อมตัวเลข build เร็วขึ้น 20%
astroperformancetooling

อัปเกรด Astro 6 → 7 บนบล็อกตัวจริง: วัดผลก่อน-หลัง แล้วมันคุ้มไหม?

เราอัปเกรดบล็อกนี้จาก Astro 6 เป็น Astro 7 จริง ๆ แล้ววัด build time / ขนาดไฟล์ ก่อน-หลังแบบไม่โม้ มาดูกันว่าได้อะไรเพิ่ม เสียอะไรไป และงานแบบไหนควรเปลี่ยน

พี่โชว์
ทำไม Astro ถึงเร็วมาก?
techperformanceastro

ทำไม Astro ถึงเร็วมาก?

เจาะลึกเทคนิค Islands Architecture ที่ทำให้ Astro ส่ง zero JavaScript by default

Dev Team