ImportRow与合并速度问题

时间:2010-07-29 13:53:07

标签: c# merge datatable

对于我自己的启发,我决定测试DataTable.ImportRow与DataTable.Merge的比较速度。我发现DataTable.ImportRow比DataTable.Merge慢很多。在极少数情况下,这两个函数具有相同的处理时间。在更罕见的情况下,ImportRow比Merge更快。

以下是我的测试结果和代码。

  1. 为什么ImportRow比Merge慢?
  2. 是什么让合并更快?
  3. alt text

        DataTable dt = new DataTable();
    
        dt.Columns.Add("customerId", typeof(int));
        dt.Columns.Add("username", typeof(string));
    
        for (int i = 0; i <= 100000; i++)
        {
            DataRow myNewRow;
            myNewRow = dt.NewRow();
            myNewRow["customerId"] = 1;
            myNewRow["username"] = "johndoe";
            dt.Rows.Add(myNewRow);
        }
    
        // First Duration
        DateTime startTime1 = DateTime.Now;
    
        DataTable dt2 = new DataTable();
        dt2 = dt.Clone();
    
        for (int i = 0; i < dt.Rows.Count; i++)
            dt2.ImportRow(dt.Rows[i]);
    
        DateTime stopTime1 = DateTime.Now;
        // End First Duration
    
        TimeSpan duration1 = stopTime1 - startTime1;
    
        // Second Duration
        DateTime startTime2 = DateTime.Now;
    
        DataTable dt3 = new DataTable();
        dt3 = dt.Clone();
        dt3.Merge(dt);
    
        DateTime stopTime2 = DateTime.Now;
        // End Second Duration
    
        TimeSpan duration2 = stopTime2 - startTime2;
    

    编辑:根据建议更新代码 -

        DataTable dt = new DataTable();
    
        dt.Columns.Add("customerId", typeof(int));
        dt.Columns.Add("username", typeof(string));
    
        DataColumn[] key = new DataColumn[1];
    
        key[0] = dt.Columns[0];
    
        dt.PrimaryKey = key;
    
        for (int i = 0; i <= 100000; i++)
        {
            DataRow myNewRow;
            myNewRow = dt.NewRow();
            myNewRow["customerId"] = i;
            myNewRow["username"] = "johndoe";
            dt.Rows.Add(myNewRow);
        }
    
        // First Duration
        //DateTime startTime1 = DateTime.Now;
    
        Stopwatch sw1 = new Stopwatch();
        sw1.Start();
    
        DataTable dt2 = new DataTable();
        dt2 = dt.Clone();
    
        for (int i = 0; i < dt.Rows.Count; i++)
            dt2.ImportRow(dt.Rows[i]);
    
        //DateTime stopTime1 = DateTime.Now;
        sw1.Stop();
        // End First Duration
    
        TimeSpan duration1 = sw1.Elapsed;
    
        // Second Duration
        //DateTime startTime2 = DateTime.Now;
        Stopwatch sw2 = new Stopwatch();
    
        sw2.Start();
    
        DataTable dt3 = new DataTable();
        dt3 = dt.Clone();
        dt3.Merge(dt);
    
        sw2.Stop();
        //DateTime stopTime2 = DateTime.Now;
        // End Second Duration
    
        TimeSpan duration2 = sw2.Elapsed;
    
        label3.Text = duration1.Milliseconds.ToString();
        label4.Text = duration2.Milliseconds.ToString();
    

    alt text

2 个答案:

答案 0 :(得分:4)

  1. 您测量的差异非常小,特别是因为您的分辨率仅为20毫秒(日期时间)。使用秒表。

  2. 您在所有记录上设置Id = 1,因此看起来您没有正确的主键。这使得这个代表性非常不具代表性。

  3. 合并应该更快,因为可以针对批量操作进行优化。鉴于此,我发现结果更加平等。

答案 1 :(得分:1)

首先,在你在这里做出任何具体结果之前,我会使用“StopWatch”来做时间而不是DateTime.Now。 StopWatch是一种更加精确的测量工具,可以获得更一致的结果。

否则,从逻辑上讲,合并可以对添加进行优化,因为它旨在一次导入多行。