我该如何改进这种方法?

时间:2011-04-14 22:46:36

标签: c# .net performance

这是一个真正的性能问题。

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

5 个答案:

答案 0 :(得分:1)

如果在framecode上订购了SetTable中的数据,那么您可以通过数据结构使用binary search来减少查找次数。

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

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

<小时/> 另外,另外,在检查NullReferenceException参数时不要抛出SetTable,而是抛出ArgumentNullExeception。当取消引用null的引用变量时,CLR抛出空引用异常...它不应该被您的代码抛出。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

大部分时间用于将文本转换为整数。既然你说这是一个时间问题,听起来你就是在调用它 - 你有什么办法可以将数据存储为整数而不是字符串吗?

答案 3 :(得分:0)

使用字典。

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

然后当你得到一个帧码时,只需在字典中查找即可。如果它在那里,返回值。

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

答案 4 :(得分:0)

假设
(1)SetTable是一个DataTable
(2)framecodeColumn可能是你的列名
(3)framecodeColumn发生在索引0(第一列)
尝试以下方法:
SetTable.Select(“framecodeColumn&lt; framecodeValuePassedToYourMethod”,“framecodeColumn DESC”)[0]。[0]
 
基本上,通过传递过滤器,使用“Select()”方法查找DataRowCollection,按降序对结果进行排序,第一行将是您要查找的行。
当然,请使用所有需要的检查保护此行(例如,使用“GetLength()”方法查看是否确实存在满足过滤条件的结果等等。)