Trong một số trường hợp, lớp MemoryMappedViewAccessor
chỉ không cắt nó để đọc byte hiệu quả; tốt nhất chúng tôi nhận được là chung ReadArray<byte>
mà nó tuyến đường cho tất cả các cấu trúc và liên quan đến một số bước không cần thiết khi bạn chỉ cần byte.Làm thế nào tôi có thể đọc nhanh byte từ một tệp ánh xạ bộ nhớ trong .NET?
Có thể sử dụng MemoryMappedViewStream
, nhưng vì nó dựa trên số Stream
bạn cần phải tìm đúng vị trí đầu tiên, và sau đó chính thao tác đọc có nhiều bước không cần thiết hơn.
Có cách nhanh, hiệu suất cao để đọc một mảng byte từ tệp ánh xạ bộ nhớ trong .NET không, vì nó chỉ là một vùng cụ thể của không gian địa chỉ để đọc?
Bạn nên sử dụng Khối thực thi quan trọng và thử cuối cùng để đảm bảo rằng ReleasePointer chạy ngay cả khi Marshal.Copy ném ngoại lệ. –
Câu trả lời hay =) Thật vậy, lược tả cho thấy trình bao bọc được quản lý chậm hơn 30 lần so với sử dụng một con trỏ không an toàn để truy cập vào bộ nhớ được ánh xạ. –
@MattHowells Tôi đồng ý. Tôi đọc rằng CER có thể ảnh hưởng đến hiệu suất, nhưng nó có vẻ cẩu thả (trong một bài kiểm tra kiểm soát ít nhất). Bất kể hàm ý hiệu suất nào, đó là mẫu sử dụng chính xác như được mô tả trong phần "nhận xét" ở đây; https://msdn.microsoft.com/en-us/library/system.runtime.interopservices.safebuffer.acquirepointer(v=vs.110).aspx – LaFleur