Câu hỏi này dường như là vô nghĩa. Hành vi không thể được sao chép một cách đáng tin cậy.Dictionary.Điều chỉnh hiệu suất
So sánh các chương trình thử nghiệm sau đây, tôi quan sát thấy một khổng lồ chênh lệch hiệu suất giữa đầu tiên và thứ hai trong những ví dụ sau đây (ví dụ đầu tiên là do yếu tố mười chậm hơn so với thứ hai):
dụ đầu tiên (chậm):
interface IWrappedDict {
int Number { get; }
void AddSomething (string k, string v);
}
class WrappedDict : IWrappedDict {
private Dictionary<string, string> dict = new Dictionary<string,string>();
public void AddSomething (string k, string v) {
dict.Add (k, v);
}
public int Number { get { return dict.Count; } }
}
class TestClass {
private IWrappedDict wrappedDict;
public TestClass (IWrappedDict theWrappedDict) {
wrappedDict = theWrappedDict;
}
public void DoSomething() {
// this function does the performance test
for (int i = 0; i < 1000000; ++i) {
var c = wrappedDict.Number; wrappedDict.AddSomething (...);
}
}
}
dụ thứ hai (nhanh):
// IWrappedDict as above
class WrappedDict : IWrappedDict {
private Dictionary<string, string> dict = new Dictionary<string,string>();
private int c = 0;
public void AddSomething (string k, string v) {
dict.Add (k, v); ++ c;
}
public int Number { get { return c; } }
}
// rest as above
Funnily, sự khác biệt biến mất (ví dụ đầu tiên cũng nhanh) nếu tôi thay đổi loại biến thành viên TestClass.wrappedDict
từ IWrappedDict
thành WrappedDict
. Giải thích của tôi về điều này là Dictionary.Count
tính lại các phần tử mỗi khi nó được truy cập và bộ nhớ đệm tiềm năng của số lượng các phần tử được thực hiện bằng cách tối ưu hóa trình biên dịch chỉ.
Ai đó có thể xác nhận điều này không? Có cách nào để có được số lượng các phần tử trong một Dictionary
theo cách thực hiện không?
Thật đáng ngạc nhiên khi xem xét 'Lấy giá trị của thuộc tính (đếm) này là một hoạt động O (1)' [Dictionary.Count - MSDN] (http://msdn.microsoft.com/en-us/library/zhcy256f .aspx) – Habib
Tôi đã đặt cùng một thử nghiệm từ mã của bạn và đối với tôi mã chậm chỉ mất ~ 30% dài hơn mã nhanh. – Rawling
Re "Tôi nên làm gì?" (mod-flag): đăng mã mà bạn có ** hiển thị những gì bạn đang thấy **, bao gồm cơ chế thời gian của bạn. Làm cho nó runnable, vì vậy chúng tôi có thể xem những gì là lên. –