2011-04-14 124 views
0

这是一个真正的性能问题。我该如何改进这种方法?

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; 
    } 
+2

结帐关于[以下博文](http://ayende.com/Blog/archive/2011/04/13/the-seven-deadly-sins-for-the-developer-some-restrictions.aspx)抛出一个'NullReferenceException'。当你(或者那个人)写这段代码的时候,你是否意识到自己犯了罪? – 2011-04-14 22:49:52

+0

为什么?它看起来像是通过某种列表结构的线性扫描,列表有多大? – 2011-04-14 22:49:57

+0

SetTable的实际类型是什么。行[I] [0]?有多少行? – BrandonAGr 2011-04-14 23:01:44

回答

1

如果在设定的数据被下令framecode比你可以使用一个binary search通过数据结构,减少查找次数。

如果数据中没有可用于优化性能的模式可能会变得棘手。这假设您不能将数据从SetTable导出到查找速度更快的结构中。

如果在同一组数据上频繁地调用此Find方法,那么您可能还需要考虑创建索引结构(字典)以加快随后的查找速度。这可以减轻反复迭代相同数据的成本。


另外,顺便说一句,不要当你检查 SetTable说法,扔 ArgumentNullExeception,而不是抛出一个 NullReferenceException。当一个空引用变量被解引用时,CLR抛出空引用异常......它不应该被代码抛出。

0

通过与表格中的列交换行,您可能会获得一些改进。从表格中的一行顺序获取元素比获取每个第n个元素要快。 (这与缓存未命中有关)

+0

转换为整数会比读取内存昂贵得多。这里的任何优势都会很小。 – 2011-04-14 23:00:33

+0

是的。另一方面,这是一种快于平均值的二分搜索算法(第三项)http://infoarena.ro/multe-smenuri-de-programare-in-cc-si-nu-numai – titus 2011-04-14 23:38:51

0

你的大部分时间将花费在文本转换为整数。既然你说这是一个时间问题,听起来好像你在调用这么多 - 有没有什么可以将数据存储为整数而不是字符串?

0

使用词典。

Key -- SetTable.Rows[i][0] 
Value -- SetTable.Rows[i-1][0]. 

然后,当你得到一个framecode,只是看它在字典中。如果它在那里,则返回值。

在存储字典之前,您可以通过在键和值上使用Convert.Int32来获得更高的效率,那么不需要进一步的转换。

0

假设
(1)可设置为一个DataTable
(2)framecodeColumn也许是您的列名
(3)framecodeColumn在索引0处(第一列)
尝试以下发生:
SetTable.Select (“framecodeColumn < framecodeValuePassedToYourMethod”,“framecodeColumn DESC”)[0]。[0]

基本上,使用“Select()”方法通过传递过滤器,按降序对结果进行排序,第一行将是您正在查找的行来查找DataRowCollection。
当然,请使用所有必要的检查来保护此行(例如,使用“GetLength()”方法等查看是否确实满足过滤条件的结果)。