DataTable操作中的效能問題

來源:互聯網
上載者:User
最近的一項工作是關於效能提升方面的。要做的第一個事情是要把很多同類型的DataTable合并到一起,查了很多關於DataTable的相關函數以後,我決定用Merge函數來合并這些DataTable。
      DataTable[] srcTables = ... ;
      foreach( DataTable src in srcTables )
      {
         dest.Merge( src ) ;
      }
      但是測試的結果讓我很是失望,效能不是一般的不好。經過調查發現效能的瓶頸在Merge函數這裡。後來經過測試,發現如果用下面的代碼:
      DataTable[] srcTables = ... ;
      foreach( DataTable src in srcTables )
      {
         foreach( DataRow row in src.Rows)
         {
            dest.ImportRow( row ) ;      
         }
      }
   
      結果讓人驚奇的是,下面的代面的速度是上面的代碼速度的100倍!

      還做了一個事情,就是對DataTable進行filter的時候 ,我的一個同事和我說了以下的代碼:
      DataView dv = dt.DefaultView ;
      dv.RowFilter = filter ;
      DataTable result = dv.ToTable() ;
      上面的代碼是能工作的,但是它的效能一點都不好,後來我把上面的代碼改成了:
      DataRow[] rows = dv.Select( filter ) ;
      foreach( DataRow row in rows )
      {
         result.ImportRow(row) ;
      }

      也有數十倍的效能提高。

      沒想到有這麼多的朋友看這個文章,我看了一下Table的Merge函數,下面是關鍵函數:

private void MergeTable(DataTable src, DataTable dst)            {            int count = src.Rows.Count;            bool flag = dst.Rows.Count == 0;            if (0 < count)            {            Index ndx = null;            DataKey srcKey = new DataKey();            dst.SuspendIndexEvents();            try            {            if (!flag && (dst.primaryKey != null))            {            srcKey = this.GetSrcKey(src, dst);            if (srcKey.HasValue)            {            ndx = dst.primaryKey.Key.GetSortIndex(DataViewRowState.OriginalRows | DataViewRowState.Added);            }            }            for (int i = 0; i < count; i++)            {            DataRow row2 = src.Rows[i];            DataRow targetRow = null;            if (ndx != null)            {            targetRow = dst.FindMergeTarget(row2, srcKey, ndx);            }            dst.MergeRow(row2, targetRow, this.preserveChanges, ndx);            }            }            finally            {            dst.RestoreIndexEvents(true);            }            }            this.MergeExtendedProperties(src.ExtendedProperties, dst.ExtendedProperties);            }            

      從中我們可以看到Merge做了什麼,Merge Table的時候,對每一行,都要有一個對Index進行操作的過程,查看現在要進行insert的row是不是存在重複等等操作。而對我們只想進行append操作的時候,顯然是多餘的了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.