2009-09-20 25 views
5

BỐI CẢNH:Làm thế nào để thực hiện riêng tạo mảng byte của tôi và xử lý

Trong khi đang chạy ứng dụng của mình thông qua một hồ sơ, có vẻ như các điểm nóng đều tham gia vào việc phân bổ một số lượng lớn các byte mới tạm thời [] mảng.

Trong một lần chạy theo CLR Profiler, một vài thời gian ngắn (3-5 giây thời gian CPU bên ngoài trình tạo hồ sơ) tạo ra trên một gigabyte rác, phần lớn phân bổ byte [] và điều này đã kích hoạt hơn 500 bộ sưu tập.

Trong một số trường hợp, dường như ứng dụng đang chi tiêu tối đa 10% thời gian thực hiện các bộ sưu tập CPU của nó.

Rõ ràng viết lại theo thứ tự.

Vì vậy, tôi đang nghĩ đến việc thay thế phân bổ byte [] mới với một lớp pool có thể tái sử dụng bộ đệm sau này.

Something như thế này ...

{ 
byte[] temp = Pool.AllocateBuffer(1024); 
... 
} 

HỎI:

Làm thế nào tôi có thể buộc các ứng dụng gọi các mã trong Pool.deAllocate thói quen (temp) khi tạm thời không còn cần thiết.

Trong đoạn mã trên, khi temp là bộ đệm byte được cấp phát Pool [], nhưng khi nó nằm ngoài phạm vi, nó sẽ bị xóa. Không phải là một vấn đề thực sự, nhưng không được tái sử dụng bởi các hồ bơi.

Tôi biết tôi có thể thay thế "số 0 trả lại"; với "Pool.deAllocate (temp); trả về 0", nhưng tôi đang cố gắng buộc sự phục hồi xảy ra.

Điều này thậm chí có thể điều khiển từ xa không?

+0

Chúng là phân bổ mảng của mã của riêng bạn hay chúng là do phương pháp .NET Framework gây ra? –

+0

Phân bổ mảng mã của riêng tôi – Noah

+0

+1 để lập cấu hình trước khi tối ưu hóa! :) – TrueWill

Trả lời

4

Bạn có thể triển khai lớp Buffer triển khai IDisposable và trả bộ đệm cho hồ bơi khi nó được xử lý. Sau đó, bạn có thể cấp quyền truy cập vào mảng byte cơ bản và miễn là mọi người phát độc đáo bạn có thể tận dụng lợi thế của việc sử dụng lại.

Được cảnh báo mặc dù:

  • bộ đệm của bạn sẽ nhanh chóng kết thúc trong gen 2, mà có thể không được lý tưởng vì những lý do khác
  • Nếu một mảnh độc mã giữ tham chiếu đến các mảng byte, họ có thể theo dõi dữ liệu được sử dụng bởi mã khác
  • Bạn cần phải nhớ vứt bỏ bộ đệm vào đúng thời điểm.

Tôi thực sự có một số mã trong MiscUtil để làm điều này - xem CachingBufferManager, CachedBuffer vv Tôi không thể nói tôi đã sử dụng nó nhiều, tâm trí bạn ... và từ những gì tôi nhớ, tôi đã làm cho nó một chút phức tạp hơn tôi thực sự cần thiết để ...

EDIT: để đáp ứng với các ý kiến ​​...

  • Bạn có thể không lực đang ứng dụng để giải phóng bộ đệm, không có.Không có cơ chế phát hành tự động nào trong C# - tuyên bố using là gần nhất mà chúng tôi có.
  • Bạn có thể triển khai chuyển đổi ẩn thành byte[] trong lớp đệm để cho phép bạn gọi các phương thức có tham số mảng byte. Cá nhân tôi không phải là một fan hâm mộ của chuyển đổi tiềm ẩn, nhưng nó chắc chắn có sẵn như là một lựa chọn.
+0

Việc dùng một lần làm cho nó rõ ràng hơn là lập trình viên sẽ làm điều gì đó sau khi sử dụng (vứt bỏ), nhưng poster ban đầu yêu cầu khả năng FORCE đó. Tôi không tin điều đó là có thể. – froh42

+0

Tôi đã cố gắng để có được xung quanh bằng cách sử dụng một lớp khác nhau, bởi vì tôi gọi một số lượng lớn các thói quen với byte [] trong danh sách tham số. Khi tôi cố gắng sử dụng một lớp u8Buffer, tôi sẽ nhận được lỗi "Không thể chuyển đổi hoàn toàn kiểu 'byte []' thành 'u8Buffer []'. Có cách giải quyết dễ dàng không? – Noah

+0

@Noah: Bạn có thể cung cấp một chuyển đổi ẩn thành' byte [] 'trong lớp học của bạn Tôi không chắc chắn tôi muốn giới thiệu nó, hãy nhớ bạn –

Các vấn đề liên quan