2009-11-29 37 views
6

Câu hỏi ngớ ngẩn, nhưng trong ứng dụng winforms Im hiện đang làm việc, tôi muốn nhận số byte được phân bổ/sử dụng bởi một List<[SomeObject]> được lưu trữ trong bộ nhớ (cho mục đích thống kê). Điều này có thể không? Tôi đã tìm kiếm thông qua các tùy chọn có thể, nhưng rõ ràng là không có phương pháp myList.GetTotalBytes().Nhận kích thước byte của Danh sách <T>

Trả lời

5

Tôi không chắc chắn thời gian chạy cung cấp một phương pháp theo chương trình đáng tin cậy của việc kích thước của một đối tượng, tuy nhiên có một số tùy chọn mở cho bạn:

  • sử dụng một công cụ như CLR Profiler
  • sử dụng Marshal.SizeOf() (lợi nhuận kích thước không được quản lý của đối tượng)
  • serialize đối tượng của bạn để nhị phân cho một xấp xỉ
+0

woah, thật nhanh! cảm ơn 4 câu trả lời! Thật không may, tôi đang tìm kiếm một phương pháp có sẵn trong thời gian chạy, và hy vọng không phải cái gì đó sẽ liên quan đến tôi rách danh sách ngoài và lặp qua từng đối tượng. – Shalan

+0

bỏ qua đề cập đến CLR Profiler. Chưa bao giờ sử dụng nó trước đây, nhưng cảm ơn vì điều đó - tôi sẽ đọc thêm một chút về việc sử dụng nó! – Shalan

10

Nó thực sự phụ thuộc vào những gì bạn có ý nghĩa. Bạn có thể dự đoán có bao nhiêu byte sẽ được sử dụng bởi chính danh sách - nhưng điều đó không giống như dự đoán có bao nhiêu byte có thể đủ điều kiện để thu thập rác nếu danh sách này đủ điều kiện để thu thập.

Bits của danh sách:

  • Mảng ủng hộ (T[] - một tham chiếu đến một mảng mà chỉ có danh sách sẽ có quyền truy cập vào)
  • Kích thước (int)
  • Một gốc đồng bộ (tài liệu tham khảo)
  • số phiên bản (int)

Các chút khéo léo là quyết định bao nhiêu để đếm. Mỗi người trong số đó là khá dễ tính toán (đặc biệt nếu bạn biết rằng T là một kiểu tham chiếu, ví dụ) nhưng bạn có muốn đếm các đối tượng được tham chiếu theo danh sách không? Có phải những tài liệu tham khảo đó là những tài liệu tham khảo duy nhất hay không?

Bạn nói rằng bạn muốn biết "vì mục đích thống kê" - bạn có thể chính xác hơn không? Nếu bạn có thể nói những gì bạn thực sự quan tâm (và một chút thông tin về những gì trong danh sách và liệu có thể có các tham chiếu khác cho cùng một đối tượng), chúng tôi có thể giúp đỡ nhiều hơn.

+0

Xin chào Jon, và thanx trả lời lần thứ 4. xin lỗi 4 không rõ lắm. Danh sách là tập hợp các thực thể bảng được điền từ truy vấn LINQ. Và điều này chứa chủ yếu là các loại chuỗi và dateTime. – Shalan

+0

"cho mục đích thống kê" - cho phép truy vấn của tôi mang lại một bộ sưu tập chứa 10.000 đối tượng Entity và (giả sử tôi có thể tính toán điều này tốt hơn) mỗi đối tượng chiếm khoảng 25 byte bộ nhớ, tôi muốn nhận tổng số byte tích lũy của tất cả các thực thể Các đối tượng trong Danh sách – Shalan

+0

Như đã đề cập trước đây, tôi đang tìm một giải pháp thay thế để lặp lại các đối tượng và khoan xuống từng thuộc tính, cũng như được đề cập bởi Jan – Shalan

4

Đây có thể là câu trả lời đầy đủ, nhưng tôi sẽ đi ra ngoài và nói nếu bạn đang so sánh thống kê, hãy thực hiện tuần tự nhị phân của đối tượng thành MemoryStream và sau đó nhìn vào tài sản Length của nó như vậy:

List<string> list = new List<string> 
    { 
     "This", 
     "is", 
     "a", 
     "test" 
    }; 

    using (Stream stream = new MemoryStream()) 
    { 
     IFormatter formatter = new BinaryFormatter(); 

     formatter.Serialize(stream, list); 
     Console.WriteLine(stream.Length); 
    } 

Hãy lưu ý rằng điều này có thể thay đổi giữa các phiên bản khác nhau của khuôn khổ này và sẽ chỉ có ích cho sự so sánh giữa đồ thị đối tượng trong một chương trình duy nhất.

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