Nhóm mảng
Ngày nay, chúng ta hiếm khi sử dụng mảng. Trong hầu hết các trường hợp, chúng tôi sử dụng Danh sách<T>, cung cấp nhiều chức năng hơn và dựa trên một mảng ẩn. Nhưng có những tình huống khi hiệu suất là chìa khóa trong khi xử lý nhiều đối tượng.
Điều làm tôi ngạc nhiên là một mảng đơn giản hiệu quả gấp đôi so với một Danh sách và nó vẫn có thể được tối ưu hóa với ArrayPool.
Trong bài viết này, tôi sẽ chỉ cho bạn cách sử dụng ArrayPool với các ví dụ về mã và hiệu suất đo điểm chuẩn.
Kho lưu trữ mã
ArrayPool là gì
ArrayPool là một nhóm tài nguyên cho phép sử dụng lại các thể hiện của các kiểu mảng. Bạn có thể sử dụng nó để thuê và trả lại bộ đệm (mảng). Nó sẽ cải thiện hiệu suất khi bạn thường xuyên tạo và hủy các mảng chiếm nhiều bộ nhớ và GARBAGE COLLECTOR . Lớp này an toàn cho luồng và bạn có thể sử dụng nó đồng thời. Trong khi quay lại nhóm, bạn có thể chọn xóa hoặc không xóa nội dung mảng. Việc xóa sẽ mất nhiều thời gian hơn, nhưng trường hợp của bạn có thể yêu cầu lấy một mảng trống mỗi lần.
Làm thế nào để sử dụng nó
Có hai cách truy cập mảng từ bộ nhớ chung.
Cách đầu tiên và đơn giản nhất là sử dụng thuộc tính ArrayPool Shared .
ArrayPool<T>.Được chia sẻ
Bạn sẽ nhận được triển khai mặc định của nhóm. Nó chứa các mảng có kích thước khác nhau. Nó có thể trả về một mảng lớn hơn bạn yêu cầu nhưng chắc chắn không nhỏ hơn. Nhóm dùng chung là một cách thuận tiện để sử dụng lại các mảng, nhưng có những cách tốt hơn.
Cách hiệu quả hơn là khởi tạo nhóm của bạn bằng các phương thức tạo.
ArrayPool<T>.Tạo()
ArrayPool<T>.Create(int maxArrayLength, int maxArraysPerBucket)
Phương thức tạo trả về một phiên bản tùy chỉnh của nhóm. Bạn phải lưu trữ nó để truy cập nó từ các vị trí khác nhau để sử dụng lại nó. Phương pháp tham số hóa có thể giúp đạt được hiệu suất tốt nhất. Nó sẽ tạo một thể hiện nhóm các mảng có độ dài không quá maxArrayLength thành các nhóm có kích thước maxArraysPerBucket.
Tận dụng tính năng tổng hợp mảng trong C# để giảm phân bổ và cải thiện hiệu suất của các ứng dụng của bạn.
điểm chuẩn
Đây là một thử nghiệm đơn giản. Chúng tôi sẽ so sánh sự khác biệt giữa việc tạo một mảng mới và thuê mảng đó từ nhóm. Trong mỗi trường hợp, chúng tôi sẽ lặp qua bộ sưu tập gồm 1_000_000 phần tử. Tôi cũng sẽ đưa Danh sách<T> vào điểm chuẩn để hiển thị các lợi thế về hiệu suất của mảng.
Kho lưu trữ mã
kết luận
Điều làm tôi ngạc nhiên nhất là một mảng đơn giản hiệu quả gấp đôi so với một Danh sách về tốc độ và mức sử dụng bộ nhớ. Và nó vẫn có thể được tối ưu hóa với ArrayPool. Sử dụng một hồ bơi rõ ràng là cách để đi.
Có một sự khác biệt đáng chú ý về thời gian giữa việc sử dụng một mảng tiêu chuẩn và một mảng từ nhóm. Sự khác biệt về thời gian là thời gian cần thiết để phân bổ bộ nhớ khi tạo một mảng mới mỗi lần. Tất nhiên, cũng có sự khác biệt trong việc cấp phát bộ nhớ. ArrayPool không cần cấp phát bộ nhớ mới. Nó sử dụng lại cùng một khối.
Để cảnh báo, tôi đã thêm 'Nhóm tùy chỉnh không có bộ nhớ đệm' để bạn có thể thấy điều gì sẽ xảy ra khi bạn tạo một nhóm mới mỗi lần. Về cơ bản, nó giống như việc tạo một mảng mới mỗi lần.
Trong ví dụ đơn giản này, thật khó để chỉ ra sự khác biệt về hiệu suất giữa ArrayPool được chia sẻ và tùy chỉnh. Sẽ dễ nhận thấy khi nhiều mảng có kích thước khác nhau được sử dụng.
Việc sử dụng ArrayPool có thể không phải lúc nào cũng thuận tiện nhất, nhưng đôi khi nó có thể giúp bạn tiết kiệm rất nhiều sức mạnh tính toán khi cần thiết.

![Dù sao thì một danh sách được liên kết là gì? [Phần 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































