[原]DataTable性能问题

      这段时间在做一个数据分析的工具,需要计算和过滤大量数据。

      考虑到DataTable提供的强大功能和灵活性,数据的处理大都在DataTable中进行处理。
 
      但近段时间测试中,发现了性能的缺陷问题。于是,就开始研究性能的提高问题。

      我先给初步推测:现有模式下,程序即时优化,优化的幅度不会太大,除非改变现有的操作模式。

      于是首先,从其中一个过程是先从CSV文件读取原始数据的地方着手。一直采用Stream(流)的读取方式,怀疑是不是这里成为性能的瓶颈。于是改用ODBC:Microsoft Text Driver的方式:这样就可以像操作数据库一样来操作CSV里的数据了,通过sql语句来获取数据。但是,通过比较这两种方式后,得出的结论是:因为业务上的需要,对数据进行多次分组合并,反而用sql语句实现效率不如Stream方式,而且没有自己来操作灵活,受限于sql语句。<这里是应该写得详细些,以后注意>

      于是,否定了前面的这种推测;那影响性能的真正原因是什么呢?

      接下来,就一行行代码进行浏览,终于确定影响性能的位置,是出项在两层循环出现的位置:
 for (int j = 0; j < intSpacingValueNum; j++)
{
  for (int i = 1; i < aryline.Length; i++)
  {
    dtAll[intCSVRowCountTemp, i] += Convert.ToDecimal(aryline[i]);
      //DataTable和二维数组的差异,是每次指定“行号、列号”,取相应元素有一点差异,然而在多次的循环操作中被放大了;这可能和DataTable和二维数组自身的结构有关,没做深究
  }   
 }
      问题就出在循环里的这条语句, 因为i和j的取值很大,当i=50000,j=200,循环里面的这句就要操作1000000遍;所以性能上的丝毫差别,都会被无限放大;于是尝试,用数组来替代:
decAll[intCSVRowCountTemp, i] += Convert.ToDecimal(aryline[i]);性能立刻提高了十倍,之前用20-30秒,现在2-3秒就处理完毕。

      结论:功能和性能永远是一对矛盾体,DataTabel功能强大必然要性能差些;数组结构则反之。
      我想大家平时DataTable一定没少用,希望能给大家提个醒,其实各种数据结构都有其最佳用途,要根据需要有针对性地进行选择。       

posted on 2007-07-19 17:19  淡泊江湖  阅读(4271)  评论(14编辑  收藏  举报