2011-07-18 30 views
6

Tôi đã đọc ở đây tại SO mà Hashtable và Từ điển là khá nhiều giống nhau ngoại trừ những lợi thế của tránh boxing/unboxing.Từ điển và sử dụng bộ nhớ Hashtable

Sử dụng Kiến Profiler tôi đo một ứng dụng rất đơn giản với các cấu trúc sau:

class Node 
{ 
    Dictionary<string, Node> Children = new Dictionary<string, Node>(); 
} 

class NodeOld 
    { 
     Hashtable Children = new Hashtable(); 
    } 

Ok, một danh sách 1,5 triệu trường hợp là người đầu tiên mất khoảng 140Mb, trong khi thứ hai cần hơn 700Mb (hệ thống 64 bit).

Vì vậy, có sự khác biệt HUGE trong triển khai, phải không?

Các Ants Profiler công bố một số lượng lớn của các đối tượng Hashtable + Bucket trên gương cỡ lớn ...

Vì vậy, có một tùy chọn tương đương (bộ nhớ am hiểu) cho từ điển nếu bạn đã để dính vào 1.1?

+0

Tôi nghi ngờ rằng Từ điển được triển khai bằng cách sử dụng cây nhị phân tự cân bằng chứ không phải bảng băm. Ngoài ra, mức tiêu thụ bộ nhớ bạn tìm thấy sau khi thu gom rác hay chỉ tổng cộng được tích lũy? Khi Hashtable thay đổi kích cỡ chính nó (vì ngày càng có nhiều phần tử được thêm vào), nó có thể tạo ra nhiều hơn và nhiều hơn nữa Xô (mặc dù những cái cũ hơn sẽ đủ điều kiện để thu thập.) –

+0

cho hashtable sử dụng 700MB, rất nhiều thùng trống ? – saus

+0

Điều này mô tả việc triển khai bên trong .net HashTable và Từ điển http://msdn.microsoft.com/en-us/library/ms379571%28v=vs.80%29.aspx – hatchet

Trả lời

1

Ngay cả khi tôi bị kẹt trên .NET 1.1 Tôi sẽ không lưu trữ 1,5 triệu bản ghi vào bộ nhớ, vì vậy tôi sẽ không quan tâm. Hashtable có lẽ là cấu trúc dữ liệu tốt nhất thực hiện một bảng băm bạn có thể nhận được về mức tiêu thụ bộ nhớ và tốc độ trong .NET 1.1. Tất nhiên nếu bạn giải thích kịch bản của bạn trong một chi tiết hơn và bạn đã xác định rằng Hashtable thực sự là một nút cổ chai cho ứng dụng của bạn có thể có một số giải pháp tốt hơn.

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