この質問はナンセンスに思えます。動作を確実に再現することはできません。
次のテスト プログラムを比較すると、次の例の 1 番目と 2 番目の例では大きなパフォーマンスの違いが見られました (最初の例は 2 番目の例よりも 10 倍遅くなります)。
最初の例 (遅い):
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 (...);
}
}
}
2 番目の例 (高速):
// 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
か?