问题描述
|
这是一个实际的性能问题。
public int FindPrevIoUsFC(int framecode)
{
if (SetTable == null)
throw new NullReferenceException(\"Not loaded Log_Roadb.\");
int prevIoUsFrameCode = 0;
for (int i = 0; i < SetTable.Rows.Count; i++)
{
if (framecode == Convert.ToInt32(SetTable.Rows[i][0]))
{
prevIoUsFrameCode = Convert.ToInt32(SetTable.Rows[i - 1][0]);
break;
}
}
return prevIoUsFrameCode;
}
解决方法
如果SetTable中的数据按ѭ1排序,则可以对数据结构使用二进制搜索以减少查找次数。
如果数据中没有可利用的模式,则优化性能可能会变得棘手。假设您无法将数据从ѭ2导出到查找速度更快的结构中。
如果在同一组数据上频繁调用此Find方法,则您可能还需要考虑创建索引结构(字典)以加快后续查找的速度。这可以减轻一遍又一遍地遍历相同数据的成本。
此外,顺便说一句,当您检查
SetTable
参数时,请勿抛出NullReferenceException
,而应抛出ArgumentNullExeception
。当取消引用为null的引用变量时,CLR会引发Null引用异常……您的代码不应抛出该异常。
,通过将行与表中的列交换,可能会得到一些改进。从表中的一行顺序获取元素比获取第n个元素要快。 (这与缓存未命中有关)
,您的大部分时间都将花费在将文本转换为整数上。既然您说这是一个时间问题,这听起来好像您经常在打电话-可以将数据存储为整数而不是字符串吗?
,使用字典。
Key -- SetTable.Rows[i][0]
Value -- SetTable.Rows[i-1][0].
然后,当您获得帧代码时,只需在字典中查找即可。如果存在,则返回该值。
通过在键和值上同时使用Convert.Int32来获得更高的效率,然后再将其存储在Dictionary中,然后就不需要进一步的转换了。
,假设
(1)SetTable是一个DataTable
(2)framecodeColumn可能是您的列名
(3)framecodeColumn出现在索引0(第一列)
尝试以下方法:
SetTable.Select(\“ framecodeColumn