我不明白为什么使用 SortedDictionary 在设置和检索值方面的性能大约比 Dictionary 慢了5倍。我预计插入和删除会更慢,但不是更新或检索。我已经测试过 .Net 3.5 和 .Net 4.0 发布编译的代码。已经预先计算好了一个随机键数组,以确保随机访问并非造成差异的原因。
下面是测试的场景:
如果我做错或愚蠢的事情,请指出。
示例代码:只需将 Dictionary 替换为 SortedDictionary 即可测试差异。
下面是测试的场景:
- 使用[key]访问器进行每个值的顺序更新
- 使用[key]访问器进行每个值的顺序访问
- 使用TryGetValue进行每个值的顺序访问
- 使用[key]访问器进行每个值的随机访问
- 使用TryGetValue进行每个值的随机访问
如果我做错或愚蠢的事情,请指出。
示例代码:只需将 Dictionary 替换为 SortedDictionary 即可测试差异。
const int numLoops = 100;
const int numProperties = 30;
const int numInstances = 1000;
static void DictionaryBench(int numLoops, int numValues, int numInstances, string[] keyArray)
{
Stopwatch sw = new Stopwatch();
double total = 0.0d;
for (int j = 0; j < numLoops; j++)
{
//sw.Start();
Dictionary<string, object> original = new Dictionary<string, object>(numValues);
for (int i = 0; i < numValues; i++)
{
original.Add(String.Format("Key" + i.ToString()), "Value0:" + i.ToString());
}
List<Dictionary<string, object>> collectionList = new List<Dictionary<string, object>>(numInstances);
for (int i = 0; i < numInstances; i++)
{
collectionList.Add(new Dictionary<string, object>(original));
}
sw.Start();
//Set values on each cloned instance to uniqe values using the same keys
for (int k = 0; k < numInstances; k++)
{
for (int i = 0; i < numValues; i++)
{
collectionList[k]["Key" + i.ToString()] = "Value" + k.ToString() + ":" + i.ToString();
}
}
//Access each unique value
object temp;
for (int k = 0; k < numInstances; k++)
{
for (int i = 0; i < numValues; i++)
{
temp = collectionList[k]["Key" + i.ToString()];
}
}
//Random access
//sw.Start();
for (int k = 0; k < numInstances; k++)
{
for (int i = 0; i < numValues; i++)
{
collectionList[k].TryGetValue(keyArray[i],out temp);
}
}
sw.Stop();
total += sw.ElapsedMilliseconds;
sw.Reset();
}