2 điểm bởi GN⁺ 2024-10-20 | 1 bình luận | Chia sẻ qua WhatsApp

Cải tiến hiệu năng LINQ trong .NET 9.0

  • Lặp với Span<T>

    • Trong .NET 9.0, hiệu năng của LINQ đã được cải thiện đáng kể.
    • Khi lặp qua mảng bằng Span<T>, hiệu năng được nâng cao.
    • Sử dụng phương thức TryGetSpan() để chuyển mảng hoặc danh sách thành ReadOnlySpan<T>, từ đó tăng tốc độ lặp.
  • Phương thức TryGetSpan()

    • TryGetSpan() chuyển mảng hoặc danh sách thành ReadOnlySpan<T> để cải thiện hiệu năng lặp.
    • Việc tối ưu mã được thực hiện ở những chi tiết rất nhỏ, và đây là phần mã do các chuyên gia hiệu năng viết.
    • Mảng nội bộ của danh sách có thể thay đổi, nên cần cẩn trọng khi dùng CollectionsMarshal.AsSpan().
  • Các bên gọi TryGetSpan()

    • Bằng cách phân tích các phương thức gọi TryGetSpan(), có thể thấy nhiều phương thức Enumerable sẽ cố gắng dùng span khi đầu vào là mảng hoặc danh sách.
    • Các phép toán sử dụng yield không thể dùng tối ưu hóa này.
  • Trình lặp chuyên biệt

    • Hiệu năng được cải thiện bằng cách hợp nhất các lớp trình lặp dựa trên IIListProviderIPartition nội bộ của LINQ.
    • Tạo ra các trình lặp chuyên biệt để nhận diện và xử lý hiệu quả các chuỗi gọi LINQ cụ thể.
  • Triển khai Iterator<T> và các lớp dẫn xuất

    • Iterator<T> là một lớp trừu tượng, còn các lớp dẫn xuất chỉ ghi đè những phương thức cần thiết.
    • ListWhereSelectIterator<TSource, TResult> xử lý chuỗi Where(...).Select(...) bằng một trình lặp duy nhất để cải thiện hiệu năng.
  • Nghiên cứu trường hợp IListSkipTakeIterator<TSource>

    • Phương thức MoveNext() tránh các lần lặp không cần thiết và chỉ xử lý các phần tử trong phạm vi _minIndexInclusive_maxIndexInclusive.

Tóm tắt của GN⁺

  • Trong .NET 9.0, hiệu năng LINQ đã được cải thiện đáng kể, đặc biệt là bằng cách sử dụng Span<T>TryGetSpan() để tăng hiệu năng lặp.
  • Cấu trúc nội bộ của LINQ đã được tối ưu hóa để nhận diện các chuỗi gọi cụ thể và tạo ra các trình lặp chuyên biệt nhằm xử lý hiệu quả hơn.
  • Những cải tiến này giúp nâng cao hiệu năng của mã, và bạn có thể tận dụng các lợi ích đó bằng cách di chuyển sang phiên bản .NET mới nhất.
  • Một thư viện khác cung cấp chức năng tương tự LINQ là System.Linq.Async.

1 bình luận

 
GN⁺ 2024-10-20
Ý kiến trên Hacker News
  • Phần hữu ích nhất của LINQ là các phần mở rộng IEnumerable. Điều này cho phép viết C# theo phong cách hàm

    • Sau khi học Haskell, tôi mới hiểu được khái niệm của LINQ
    • Nếu một nhóm thiếu kinh nghiệm sử dụng, nó có thể dẫn đến mã phức tạp và chậm
  • Không thể hiểu nổi vì sao đội ngũ dotnet không đầu tư thêm nguồn lực vào công cụ

    • Có nhắc đến nhu cầu tạo tài liệu, kiểm thử đơn vị tốt hơn và cải thiện khả năng tiếp cận mã nguồn
    • Phần lớn các gói trên NuGet đều thiếu tài liệu
  • Các cải tiến hiệu năng LINQ đang tập trung vào việc cải thiện hiệu năng của chính triển khai List<T> của Microsoft

    • Cần đầu tư vào việc giảm phân bổ lambda và thời gian biên dịch
    • Có nhắc đến nhu cầu hỗ trợ wildcard cho biến LINQ
  • LINQ là một trong những yếu tố khác biệt chính giữa các ngôn ngữ

    • Hầu như không có thay đổi nào kể từ C# 3
    • Thật đáng tiếc khi nghĩ rằng LINQ chỉ hữu ích cho việc lặp qua danh sách
  • C# càng vay mượn nhiều từ F# thì càng khiến tôi hài lòng

    • Hy vọng union phân biệt sẽ được đưa vào C#
  • Khi dùng các ngôn ngữ khác, tôi nhớ LINQ

    • Việc có LINQ trong thư viện chuẩn là một lợi thế lớn
  • Một khi đã bắt đầu dùng LINQ thì khó quay lại dùng thứ khác

  • Rất khó tìm được tài liệu học phát triển web dotnet một cách toàn diện

    • Phần lớn tài liệu либо quá sơ cấp либо chất lượng thấp
  • Chú thích trong mã Net hiện đại quá phức tạp

    • Cần có cách tốt hơn
  • Có một mục liên quan đến các cải tiến hiệu năng trong .NET 9

    • Có nhắc đến khả năng tối ưu thêm trong các chuỗi kết thúc bằng những phương thức cụ thể
  • OrderBy(criteria).First() có thể được tối ưu thành Min(criteria)

    • Việc thư viện nhận ra và sửa các mẫu kém hiệu quả là một điều tích cực