gpt4 book ai didi

c# - ImportRow 与合并速度问题

转载 作者:太空狗 更新时间:2023-10-30 01:11:06 27 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

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

关于c# - ImportRow 与合并速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3363208/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com