Go 1.25 เปิดตัวแพ็กเกจ JSON v2 แบบทดลองพร้อมการปรับปรุงประสิทธิภาพครั้งใหญ่

ทีมชุมชน BigGo
Go 1.25 เปิดตัวแพ็กเกจ JSON v2 แบบทดลองพร้อมการปรับปรุงประสิทธิภาพครั้งใหญ่

Go 1.25 ได้เปิดตัวแล้วพร้อมกับการปรับปรุงที่น่าสนใจหลายประการ แต่ความสนใจของชุมชนนักพัฒนากลับมุ่งไปที่ฟีเจอร์เด่นหนึ่งเดียว นั่นคือแพ็กเกจ JSON v2 แบบทดลอง การใช้งานใหม่นี้สัญญาว่าจะแก้ไขปัญหาประสิทธิภาพที่มีมายาวนานซึ่งเป็นปัญหาให้กับนักพัฒนา Go ที่ทำงานกับข้อมูล JSON

การเปิดตัวครั้งนี้ยังคงรักษาความมุ่งมั่นของ Go ในการรองรับความเข้ากันได้แบบย้อนหลังพร้อมกับการนำเสนอการปรับปรุงที่สำคัญภายใต้ระบบ การเปลี่ยนแปลงส่วนใหญ่มุ่งเป้าไปที่ toolchain, runtime และ standard library มากกว่าตัวภาษาเอง เพื่อให้มั่นใจว่าโปรแกรม Go ที่มีอยู่จะยังคงทำงานได้อย่างราบรื่น

แพ็กเกจ JSON v2 แบบทดลองขโมยความสนใจ

แพ็กเกจ encoding/json/v2 ใหม่เป็นตัวแทนของการปรับปรุงครั้งใหญ่ในความสามารถการจัดการ JSON ของ Go ซ่อนอยู่หลังแฟล็ก GOEXPERIMENT=jsonv2 ฟีเจอร์ทดลองนี้ได้สร้างความตื่นเต้นอย่างมากในชุมชนนักพัฒนา การใช้งานใหม่นี้แก้ไขจุดเจ็บปวดที่สำคัญสองประการ คือ ปัญหาคอขวดด้านประสิทธิภาพกับเอกสารขนาดใหญ่ และการไม่สามารถเพิ่มโค้ด marshaling แบบกำหนดเองให้กับประเภทภายนอกได้

การปรับปรุงประสิทธิภาพมีความโดดเด่น โดยประสิทธิภาพการเข้ารหัสเทียบเท่ากับการใช้งานต้นฉบับ ในขณะที่การถอดรหัสแสดงให้เห็นถึงการเพิ่มความเร็วอย่างมีนัยสำคัญ สถาปัตยกรรมแบบสตรีมมิ่งแก้ไขปัญหาธรรมชาติแบบไม่สตรีมมิ่งของแพ็กเกจต้นฉบับ ซึ่งทำให้เกิดปัญหาประสิทธิภาพกับเอกสาร JSON ขนาดใหญ่ นอกจากนี้ นักพัฒนาสามารถใช้งาน custom marshaler สำหรับประเภทที่พวกเขาไม่สามารถควบคุมได้ ซึ่งเป็นฟีเจอร์ที่ได้รับการร้องขออย่างต่อเนื่องและเปิดโอกาสใหม่ ๆ สำหรับการจัดการ JSON

หมายเหตุ: GOEXPERIMENT เป็นกลไกของ Go สำหรับทดสอบฟีเจอร์ทดลองก่อนที่จะกลายเป็นส่วนหนึ่งของ standard library

คุณสมบัติหลักของ Go 1.25:

  • แพ็กเกจ JSON v2 เชิงทดลอง: ใช้งานได้ด้วยแฟล็ก GOEXPERIMENT=jsonv2

    • สถาปัตยกรรมแบบ streaming เพื่อประสิทธิภาพที่ดีขึ้นกับเอกสารขนาดใหญ่
    • รองรับการ marshaling แบบกำหนดเองสำหรับ external types
    • ประสิทธิภาพการ encoding อยู่ในระดับเดียวกัน การ decoding เร็วขึ้นอย่างมาก
    • แพ็กเกจใหม่สองตัว: encoding/json/v2 และ encoding/json/jsonpath
  • Container-Aware GOMAXPROCS:

    • พิจารณาขีดจำกัดแบนด์วิดท์ CPU จาก cgroups บน Linux โดยอัตโนมัติ
    • ปรับให้เหมาะสมเป็นระยะๆ ตาม logical CPUs ที่มีอยู่
    • จะถูกปิดใช้งานหากตั้งค่าด้วยตนเองผ่านตัวแปรสภาพแวดล้อมหรือการเรียก runtime
  • Garbage Collector เชิงทดลอง:

    • เปิดใช้งานด้วย GODEBUG=gctransform=1 ในเวลา build
    • คาดว่าจะลด GC overhead ลง 10-40%
    • ประสิทธิภาพที่ดีขึ้นสำหรับการ marking และ scanning วัตถุขนาดเล็ก

การปรับปรุง Runtime ที่รู้เรื่อง Container

Go 1.25 เปิดตัวการจัดการทรัพยากรที่ฉลาดขึ้นด้วยพฤติกรรม GOMAXPROCS ที่รู้เรื่อง container ในระบบ Linux runtime ตัวนี้จะพิจารณาขีดจำกัดแบนด์วิดท์ CPU จาก cgroups โดยปรับ GOMAXPROCS อัตโนมัติเมื่อทำงานในสภาพแวดล้อม containerized อย่าง Kubernetes การเปลี่ยนแปลงนี้ช่วยให้แอปพลิเคชัน Go ใช้ทรัพยากรที่มีอยู่ได้ดีขึ้นโดยไม่ต้องกำหนดค่าด้วยตนเอง

Runtime ยังรวมถึง garbage collector แบบทดลองที่สัญญาว่าจะลดค่าใช้จ่าย garbage collection ลง 10-40% สำหรับโปรแกรมที่ใช้ garbage collector อย่างหนัก ผลการทดสอบเบื้องต้นแสดงผลลัพธ์ที่น่าสัญญา แม้ว่าการออกแบบจะยังคงพัฒนาต่อไปตามความคิดเห็นของชุมชน

เครื่องมือพัฒนาและการดีบักที่ได้รับการปรับปรุง

เครื่องมือใหม่หลายตัวช่วยเพิ่มประสบการณ์การพัฒนา เมธอด WaitGroup.Go ทำให้รูปแบบทั่วไปของการสร้างและนับ goroutine ง่ายขึ้น ช่วยให้นักพัฒนาลดโค้ด boilerplate ได้ API trace flight recorder ใหม่ให้การติดตาม execution แบบเบาโดยบันทึกการติดตามอย่างต่อเนื่องลงใน in-memory ring buffer ทำให้สามารถดีบักเหตุการณ์หายากได้อย่างปฏิบัติได้จริง

Compiler ตอนนี้สร้างข้อมูลดีบักโดยใช้ DWARFv5 ลดขนาด binary และเวลา linking โดยเฉพาะอย่างยิ่งเป็นประโยชน์สำหรับแอปพลิเคชัน Go ขนาดใหญ่ การจัดสรร stack สำหรับ slice backing store ได้รับการปรับปรุง แม้ว่านักพัฒนาควรตรวจสอบปัญหา stack bloat ที่อาจเกิดขึ้น

การปรับปรุงเครื่องมือสำหรับนักพัฒนา:

  • เมธอด WaitGroup.Go ใหม่: ช่วยลดความซับซ้อนในการสร้าง goroutine และรูปแบบการนับ
  • Trace Flight Recorder API: runtime/trace.FlightRecorder สำหรับการติดตามการทำงานแบบน้ำหนักเบา
  • การรองรับ DWARFv5: ลดขนาดข้อมูลการ debug และเวลาในการ linking
  • การปรับปรุง Vet Analyzers: เครื่องมือวิเคราะห์ asmdecl และ loopvar ใหม่สำหรับการวิเคราะห์โค้ดที่ดีขึ้น
  • การปรับปรุงการทดสอบ: แพ็กเกจ testing/slogtest ใหม่สำหรับการทดสอบโค้ดแบบ concurrent

การอัปเดตการรองรับแพลตฟอร์ม:

  • ความต้องการขั้นต่ำ macOS 11 ( Big Sur )
  • Windows 32-bit port (GOOS=windows GOARCH=386) ถูกยกเลิกการใช้งาน จะถูกลบออกใน Go 1.26
  • การรองรับ Linux/loong64 และ Linux/riscv64 ที่ได้รับการปรับปรุง

การตอบสนองของชุมชนและมุมมองอนาคต

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

ฉันรักวิธีที่ภาษานี้เดินหน้าไป ฉันมีเพื่อนร่วมงานหลายคนที่เกลียดหลายแง่มุมของมัน แต่ฉันนั่งที่นี่รวม Go, Goa และ SQLc เขียนโค้ดเป็นภูเขาและมี compiler ที่ค่อนข้างดีอยู่เบื้องหลังฉัน

ธรรมชาติการทดลองของ JSON v2 ช่วยให้ทีม Go รวบรวมความคิดเห็นจากชุมชนก่อนที่จะสรุป API ขั้นสุดท้าย นักพัฒนาได้รับการสนับสนุนให้ทดสอบแอปพลิเคชันของพวกเขาด้วยการใช้งานใหม่เพื่อช่วยระบุปัญหาความเข้ากันได้และให้ข้อมูลเกี่ยวกับการออกแบบที่กำลังพัฒนา

ในขณะที่ Go ยังคงเติบโต การเปิดตัวอย่าง 1.25 แสดงให้เห็นถึงความมุ่งมั่นของทีมในการปรับปรุงแบบเพิ่มหน่วยที่เพิ่มประสิทธิภาพการทำงานของนักพัฒนาในขณะที่รักษาหลักการหลักของภาษาในด้านความเรียบง่ายและความน่าเชื่อถือ

อ้างอิง: Go 1.25 Release Notes