【发布时间】:2010-10-25 06:16:27
【问题描述】:
我发现与平面数组访问相比,字典查找可能非常慢。知道为什么吗?我正在使用 Ants Profiler 进行性能测试。这是一个重现问题的示例函数:
private static void NodeDisplace()
{
var nodeDisplacement = new Dictionary<double, double[]>();
var times = new List<double>();
for (int i = 0; i < 6000; i++)
{
times.Add(i * 0.02);
}
foreach (var time in times)
{
nodeDisplacement.Add(time, new double[6]);
}
var five = 5;
var six = 6;
int modes = 10;
var arrayList = new double[times.Count*6];
for (int i = 0; i < modes; i++)
{
int k=0;
foreach (var time in times)
{
for (int j = 0; j < 6; j++)
{
var simpelCompute = five * six; // 0.027 sec
nodeDisplacement[time][j] = simpelCompute; //0.403 sec
arrayList[6*k+j] = simpelCompute; //0.0278 sec
}
k++;
}
}
}
注意到平面数组访问和字典访问之间的相对大小了吗?考虑到数组索引操作 (6*k+j) 后,平面数组比字典访问 (0.403/0.0278) 快大约 20 倍。
听起来很奇怪,但字典查找占用了我大部分时间,我必须对其进行优化。
【问题讨论】:
-
但是索引访问通常比哈希查找快...你说的怪异是什么意思?
-
@Mitch,他用 ANTS Profiler 测量
-
@Nick,但相差 20 倍?
-
@Ngu:当然。还有很多工作要做。数组访问对于 CPU 来说是绝对的礼物——它几乎不需要做任何事情。
-
你不是在比较苹果和橙子吗?您用于字典和数组访问的索引不一样。当然,使用整数索引的数组访问比使用任意类型 (
double) 的字典访问要快。 并且您的字典访问执行附加数组访问,而其他代码中只有一个数组访问。考虑到数组访问基本上没有成本,20 倍听起来是对的。
标签: c# performance