Trong ứng dụng của chúng ta, chúng ta có một mảng byte rất lớn và chúng ta phải chuyển đổi các byte này thành các kiểu khác nhau. Hiện tại, chúng tôi sử dụng BitConverter.ToXXXX()
cho mục đích này. Những người chơi nặng nề của chúng tôi là ToInt16
và ToUInt64
.Nhanh chóng truyền trong C# bằng cách sử dụng BitConverter, nó có thể nhanh hơn không?
Đối với UInt64
, vấn đề của chúng tôi là luồng dữ liệu thực tế có 6 byte dữ liệu để biểu thị một số nguyên lớn. Vì không có chức năng tự nhiên để chuyển đổi 6-byte dữ liệu để UInt64
, chúng tôi làm:
UInt64 value = BitConverter.ToUInt64() & 0x0000ffffffffffff;
sử dụng của chúng tôi ToInt16
là đơn giản hơn, làm không cần phải làm bất cứ thao tác bit.
Chúng tôi thực hiện rất nhiều trong số 2 hoạt động này mà tôi muốn hỏi cộng đồng SO xem có cách nào nhanh hơn để thực hiện các chuyển đổi này hay không. Ngay bây giờ, khoảng 20% toàn bộ chu kỳ CPU của chúng tôi được tiêu thụ bởi hai chức năng này.
Hiệu suất nguyên bản không phải là vấn đề của bạn. Xử lý các mảng lớn hầu như luôn làm cho bus RAM chậm bị nghẽn. Hãy chú ý đến bộ đếm hiệu suất "Last Level Cache Misses" trong đầu ra profiler của bạn. –
@Hans: Bạn chắc chắn đúng: Chúng tôi là bộ nhớ bị ràng buộc. Nhưng vì điều đó, tôi không biết phải làm gì. Chúng ta có một mảng lớn và chúng ta phải đi qua từng byte để trích xuất dữ liệu. Khi tôi đi tuyến tính trong mảng, trình tìm nạp trước phần cứng có thể khóa vào mẫu truy cập và hơn thế nữa, tôi không biết điều gì khác có thể được thực hiện. --thanks – SomethingBetter