【问题标题】:ImportRow vs Merge Speed QuestionImportRow 与合并速度问题
【发布时间】:2011-03-22 17:59:29
【问题描述】:

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

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

  1. 为什么 ImportRow 比 Merge 慢?
  2. 是什么让 Merge 更快?

    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();

【问题讨论】:

  • 我建议使用 Reflector 来看看实现并自己看看

标签: c# merge datatable


【解决方案1】:
  1. 您测量的差异非常小,特别是因为您的分辨率只有 20 毫秒(日期时间)。使用秒表。

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

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

【讨论】:

  • 我修改了代码以使用秒表和主键。合并现在明显更快。
【解决方案2】:

首先,在您在这里做出任何具体结果之前,我会使用“StopWatch”来进行计时,而不是 DateTime.Now。秒表是一种更精确的测量工具,将获得更一致的结果。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    • 2011-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多