我遇到了一个非常奇怪的问题,即方法的执行时间似乎越多,它的调用就越多。
这是我的方法,检查是否需要更新记录。
public override bool NeedsUpdate(object obj)
{
BizContact contact = obj as BizContact;
int id = contact.ID;
DataRow contactRow = dbRows.FirstOrDefault(dr =>(int)dr[keyMapping.ColumnName]) == contact.ID);
if (contactRow == null)
return false;
DateTime localLastModified = (DateTime)contactRow["LastModified"];
return contact.LastModified > localLastModified;
}
dbRows集合是一个List,其大小在第一次调用NeedsUpdate后不会增加。
需要检查大量记录,以便在循环中多次调用NeedsUpdate。
第一次调用时,运行时间不到1毫秒。
在1,000次调用之后,该方法需要64毫秒才能完成。
在2,000次调用后,该方法需要138毫秒才能完成。
3000次调用后,该方法需要187毫秒才能完成。
dbRows集合有28,000条记录,所以我知道查找时间需要一段时间,但我至少会期望它是一致的。
知道我可能缺少什么吗?
这是如何使用的:
foreach (object obj in dataWrapper.GetObjects())
{
// OTHER CODE
Stopwatch checkUpdateSW = Stopwatch.StartNew();
bool needsUpdate = dataWrapper.NeedsUpdate(obj);
checkUpdateSW.Stop();
// OTHER CODE
}
答案 0 :(得分:2)
线性搜索实际上比您预期的要快的一种情况是您要查找的项目是否在大列表的开头。
可能的解释 - 您正在搜索每次通话时距离开头较远的记录。基本列表示例:
var list = Enumerable.Range(1,10000).ToList();
for (var i = 0; i < 10000; i++)
{
// this linear search call will be very fast first and gradually
// slow down toward the end
var r = list.FirstOrDefaut(i);
}