这个问题似乎是无稽之谈。该行为无法可靠地再现。
比较以下测试程序,我观察到以下示例中的第一个和第二个之间存在巨大的性能差异(第一个示例比第二个慢十倍):
第一个例子(慢):
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 (...);
}
}
}
第二个例子(快速):
// 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
有趣的是,如果我将成员变量的类型TestClass.wrappedDict
从IWrappedDict
更改为 ,差异就会消失(第一个示例也很快) WrappedDict
。我对此的解释是,Dictionary.Count
每次访问元素时都会重新计算元素,并且元素数量的潜在缓存仅由编译器优化完成。
有人可以证实这一点吗?有没有办法以Dictionary
一种高性能的方式获取元素的数量?