การปรับปรุงประสิทธิภาพของ LINQ ใน .NET 9.0
(blog.ndepend.com)การปรับปรุงประสิทธิภาพของ 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ส่วนที่มีประโยชน์ที่สุดของ LINQ คือการขยาย
IEnumerableซึ่งทำให้สามารถเขียน C# ในสไตล์เชิงฟังก์ชันได้ไม่เข้าใจว่าทำไมทีม dotnet ถึงไม่ลงทุนทรัพยากรกับเครื่องมือให้มากกว่านี้
การปรับปรุงประสิทธิภาพของ LINQ มุ่งเน้นไปที่การปรับปรุงประสิทธิภาพของ
List<T>implementation ของ Microsoft เองLINQ เป็นหนึ่งในจุดแตกต่างสำคัญระหว่างภาษา
ยิ่ง C# ยืมแนวคิดจาก F# มาได้มากเท่าไร ก็ยิ่งน่าพอใจมากขึ้น
เวลาต้องใช้ภาษาอื่นก็จะคิดถึง LINQ
พอเริ่มใช้ LINQ แล้ว ก็ยากที่จะหันไปใช้อย่างอื่น
หาแหล่งเรียนรู้การพัฒนาเว็บด้วย dotnet แบบครอบคลุมได้ยาก
คอมเมนต์ในโค้ด Net ยุคใหม่ซับซ้อนเกินไป
มีส่วนที่เกี่ยวกับการปรับปรุงประสิทธิภาพใน .NET 9
OrderBy(criteria).First()สามารถ optimize เป็นMin(criteria)ได้