Trong serialiser tôi/deserialiser, tôi có đoạn mã sau:Cách nhanh nhất để kiểm tra xem một loại có bị blittable không?
if (element_type.IsValueType && collection_type.IsArray)
{
try
{
GCHandle h = GCHandle.Alloc(array_object, GCHandleType.Pinned);
int arrayDataSize = Marshal.SizeOf(element_type) * c.Count;
var array_data = new byte[arrayDataSize];
Marshal.Copy(h.AddrOfPinnedObject(), array_data, 0, arrayDataSize);
h.Free();
WriteByteArray(array_data);
return;
}
catch (ArgumentException)
{
//if the value type is not blittable, then we need to serialise each array item one at a time
}
}
Mục đích của nó là để thử và viết một loạt các loại giá trị cho một dòng suối, một cách hiệu quả nhất có thể (có nghĩa là, chỉ cần nội dung dưới dạng một loạt các byte).
Sự cố xảy ra khi loại là loại giá trị nhưng không thể xóa được và Alloc() không thành công. Tại thời điểm ngoại lệ bị bắt và kiểm soát được chuyển tới mã liên quan đến mảng như thể nó bao gồm các kiểu tham chiếu.
Tuy nhiên, kiểm tra này (do việc ném và bắt ngoại lệ mà tôi hiểu rất chậm) đang chứng minh là một nút cổ chai nghiêm trọng do số lượng loại giá trị gặp phải trong đơn đăng ký của tôi. Vì vậy, tôi tự hỏi, cách nhanh nhất để kiểm tra xem một loại là blittable là gì?
Tôi gặp vấn đề tương tự, tôi đã kết thúc lưu vào bộ nhớ cache kết quả cho từng loại (ví dụ: trong từ điển tĩnh). Việc kiểm tra được thực hiện giống như ở đây, hãy thử/nắm bắt. –