2010-07-18 38 views
11

Tôi đang cố gắng thay thế những gì tôi thường thực hiện dưới dạng bộ đệm tròn +. Hàm của hàng đợi là để đệm các byte vào (ví dụ: từ cổng nối tiếp hoặc một số luồng dữ liệu khác), trong khi trình phân tích cú pháp kiểm tra các byte trong hàng đợi và phát hiện và trích xuất các gói tin.Hàng đợi C# byte hiệu quả để phân tích cú pháp luồng byte cho gói tin nhị phân

Tiêu chí:

  • có thể phát triển (tức là không cố định cỡ)
  • = 1 byte có thể được enqueued tại một thời điểm

  • = 1 byte có thể dequeued tại một thời điểm

  • hiệu quả

Tôi bị cám dỗ chỉ để sử dụng

System.Collections.Generic.Queue<byte> 

... nhưng tôi không chắc chắn nếu điều này là loại hiệu quả nhất để sử dụng. Bất kỳ đề xuất?

Có cách nào thông minh hơn để làm những gì tôi đang cố gắng làm không? (Ví dụ: Đề xuất thú vị here)

Cảm ơn đề xuất của bạn & đầu vào.

Prembo.

Trả lời

1

Queue<byte> được hỗ trợ bởi byte[], nhưng bạn sẽ thấy hiệu suất tốt hơn nếu sao chép vào/từ bộ đệm cơ bản bằng cách sử dụng Array.Copy thay vì lặp qua phương pháp Enqueue/Dequeue. Vì vậy, nếu cá nhân, nếu Queue<byte> không cung cấp cho bạn hiệu suất bạn muốn, thì bạn có thể triển khai lớp xếp hàng của riêng bạn cung cấp các phương thức QueueMultiple và DequeueMultiple.

3

Vâng, Queue<byte> sẽ có hiệu quả về bộ nhớ. Về cơ bản nó sẽ là byte[] đằng sau hậu trường. Nó có thể hơi khó xử để làm việc với nếu bạn muốn dequeue hoặc enqueue toàn bộ khối tại một thời điểm mặc dù. Mỗi hoạt động nên được phân bổ O (1) cho một byte đơn, dẫn đến O (n) để enqueue hoặc dequeue một đoạn có kích thước n ... nhưng các yếu tố tỷ lệ sẽ cao hơn (nói) một bản sao khối đệm.

2

Tùy thuộc vào cách nhận được byte đến và cách trình phân tích cú pháp kiểm tra chúng, bạn có thể xem xét Queue<byte[]>.

1

Tôi biết tôi không hữu ích, nhưng bạn có thể viết một tài khoản của riêng bạn.
Phần lý thuyết:
Hàng đợi phải ở trong byte[] và 2 chỉ số, 1 đầu và 1 cho đuôi

 
0             n 
|----------------------------------------------------| 
       |      | 
       head      tail 

Mỗi lần bạn cần phải thêm k byte bạn di chuyển đuôi k đơn vị còn lại và đặt trong không gian mới tạo ra dữ liệu ở đó.

 
0             n 
|-------------------------------new data-------------| 
       |    |  | 
       head   new tail old tail 

Mỗi lần bạn cần phải bật k byte bạn di chuyển đầu k đơn vị trái và lấy dữ liệu từ không gian bị mất.

 
0             n 
|-------new data-------------------------------------| 
     |  |      | 
    new head head      tail 

Trong trường hợp đầu và đuôi va chạm, bạn cần tăng gấp đôi kích thước của vùng chứa và sao chép mỗi nửa sang vùng chứa mới.

Lưu ý: nếu bạn thêm 1234 và sau đó bật 2 chữ cái bạn sẽ nhận được 34

(Tôi không biết nếu tôi nên đánh dấu bài đăng này là cộng đồng wiki)

+0

Nói chung mọi người không đánh dấu câu trả lời của họ như wiki cộng đồng. Nếu câu hỏi là wiki cộng đồng, thì câu trả lời cũng sẽ là wiki cộng đồng. –

+0

Tôi đoán tôi đã hiểu nhầm cộng đồng wiki là gì. – Dani

1

Dưới đây là an efficient implementation của một bộ đệm tôi đã viết một trong khi trước đây:

  • resizeable: cho phép xếp hàng lên dữ liệu và không vứt tràn bộ đệm ngoại lệ;
  • hiệu quả: sử dụng một bộ đệm đơn và các hoạt động Buffer.Copy để enqueue/dữ liệu dequeue
Các vấn đề liên quan