2 คะแนน โดย GN⁺ 2024-10-20 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

การปรับปรุงประสิทธิภาพของ LINQ ใน .NET 9.0

  • การวนซ้ำโดยใช้ Span<T>

    • ใน .NET 9.0 ประสิทธิภาพของ LINQ ได้รับการปรับปรุงอย่างมาก
    • การวนซ้ำอาร์เรย์ด้วย Span<T> ช่วยเพิ่มประสิทธิภาพ
    • ใช้เมธอด TryGetSpan() เพื่อแปลงอาร์เรย์หรือรายการให้เป็น ReadOnlySpan<T> และเพิ่มความเร็วในการวนซ้ำ
  • เมธอด TryGetSpan()

    • TryGetSpan() ช่วยปรับปรุงประสิทธิภาพการวนซ้ำโดยแปลงอาร์เรย์หรือรายการเป็น ReadOnlySpan<T>
    • การปรับแต่งโค้ดเกิดขึ้นในรายละเอียดเล็ก ๆ และเป็นโค้ดที่เขียนโดยผู้เชี่ยวชาญด้านประสิทธิภาพ
    • เนื่องจากอาร์เรย์ภายในของรายการอาจเปลี่ยนแปลงได้ จึงต้องระมัดระวังเมื่อใช้ CollectionsMarshal.AsSpan()
  • ผู้เรียกใช้ TryGetSpan()

    • จากการวิเคราะห์เมธอดที่เรียก TryGetSpan() พบว่าเมธอดจำนวนมากใน Enumerable จะพยายามใช้สแปนเมื่อข้อมูลเป็นอาร์เรย์หรือรายการ
    • การดำเนินการที่ใช้ yield ไม่สามารถใช้การเพิ่มประสิทธิภาพนี้ได้
  • ตัววนซ้ำแบบเฉพาะทาง

    • มีการปรับปรุงประสิทธิภาพโดยรวมคลาสตัววนซ้ำที่อิงกับ IIListProvider และ IPartition ภายในของ LINQ เข้าด้วยกัน
    • มีการสร้างตัววนซ้ำแบบเฉพาะทางที่รู้จักเชนการเรียก LINQ บางรูปแบบและจัดการได้อย่างมีประสิทธิภาพ
  • การใช้งาน Iterator<T> และคลาสที่สืบทอด

    • Iterator<T> เป็นคลาสนามธรรม และคลาสที่สืบทอดจะ override เฉพาะเมธอดที่จำเป็น
    • ListWhereSelectIterator<TSource, TResult> ประมวลผลเชน Where(...).Select(...) ด้วยตัววนซ้ำตัวเดียวเพื่อเพิ่มประสิทธิภาพ
  • กรณีศึกษาของ IListSkipTakeIterator<TSource>

    • เมธอด MoveNext() หลีกเลี่ยงการวนซ้ำที่ไม่จำเป็น และประมวลผลเฉพาะองค์ประกอบที่อยู่ในช่วง _minIndexInclusive และ _maxIndexInclusive

สรุปโดย GN⁺

  • ใน .NET 9.0 ประสิทธิภาพของ LINQ ได้รับการปรับปรุงอย่างมาก โดยเฉพาะการใช้ Span<T> และ TryGetSpan() เพื่อเพิ่มประสิทธิภาพการวนซ้ำ
  • โครงสร้างภายในของ LINQ ถูกปรับแต่งให้เหมาะสมขึ้น โดยสามารถจดจำเชนการเรียกบางแบบและสร้างตัววนซ้ำเฉพาะทางเพื่อจัดการอย่างมีประสิทธิภาพ
  • การปรับปรุงเหล่านี้ช่วยเพิ่มประสิทธิภาพของโค้ด และสามารถได้รับประโยชน์เหล่านี้ได้ด้วยการย้ายไปใช้ .NET เวอร์ชันใหม่ล่าสุด
  • ไลบรารีอื่นที่มีความสามารถคล้ายกับ LINQ คือ System.Linq.Async

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

 
GN⁺ 2024-10-20
ความคิดเห็นจาก Hacker News
  • ส่วนที่มีประโยชน์ที่สุดของ LINQ คือการขยาย IEnumerable ซึ่งทำให้สามารถเขียน C# ในสไตล์เชิงฟังก์ชันได้

    • หลังจากได้เรียน Haskell แล้ว ก็เข้าใจแนวคิดของ LINQ
    • หากทีมที่ไม่มีประสบการณ์นำไปใช้ อาจกลายเป็นโค้ดที่ซับซ้อนและช้าได้
  • ไม่เข้าใจว่าทำไมทีม dotnet ถึงไม่ลงทุนทรัพยากรกับเครื่องมือให้มากกว่านี้

    • มีการกล่าวถึงความจำเป็นของการสร้างเอกสาร, unit test ที่ดีกว่าเดิม, และการปรับปรุงการเข้าถึงซอร์สโค้ด
    • แพ็กเกจส่วนใหญ่ใน NuGet ขาดเอกสารประกอบ
  • การปรับปรุงประสิทธิภาพของ LINQ มุ่งเน้นไปที่การปรับปรุงประสิทธิภาพของ List<T> implementation ของ Microsoft เอง

    • เน้นย้ำถึงความจำเป็นในการลงทุนเพื่อลดการจัดสรรหน่วยความจำของ lambda และเวลาในการคอมไพล์
    • มีการกล่าวถึงความจำเป็นของการรองรับ wildcard สำหรับตัวแปรใน LINQ
  • LINQ เป็นหนึ่งในจุดแตกต่างสำคัญระหว่างภาษา

    • แทบไม่มีการเปลี่ยนแปลงเลยนับตั้งแต่ C# 3
    • เป็นเรื่องน่าเสียดายหากคิดว่า LINQ มีประโยชน์แค่กับการวนลูปรายการเท่านั้น
  • ยิ่ง C# ยืมแนวคิดจาก F# มาได้มากเท่าไร ก็ยิ่งน่าพอใจมากขึ้น

    • คาดหวังว่าจะมีการนำ discriminated unions เข้ามาใน C#
  • เวลาต้องใช้ภาษาอื่นก็จะคิดถึง LINQ

    • การที่ standard library มี LINQ อยู่ด้วยเป็นข้อได้เปรียบอย่างมาก
  • พอเริ่มใช้ LINQ แล้ว ก็ยากที่จะหันไปใช้อย่างอื่น

  • หาแหล่งเรียนรู้การพัฒนาเว็บด้วย dotnet แบบครอบคลุมได้ยาก

    • เนื้อหาส่วนใหญ่เป็นระดับพื้นฐานเกินไปหรือคุณภาพต่ำ
  • คอมเมนต์ในโค้ด Net ยุคใหม่ซับซ้อนเกินไป

    • จำเป็นต้องมีวิธีที่ดีกว่านี้
  • มีส่วนที่เกี่ยวกับการปรับปรุงประสิทธิภาพใน .NET 9

    • มีการกล่าวถึงว่ายังสามารถเพิ่มการปรับให้เหมาะสมได้อีกสำหรับ chain ที่ลงท้ายด้วยเมธอดบางตัว
  • OrderBy(criteria).First() สามารถ optimize เป็น Min(criteria) ได้

    • การที่ไลบรารีสามารถตรวจจับรูปแบบที่ไม่มีประสิทธิภาพและแก้ไขให้ได้เป็นเรื่องที่ดี