【发布时间】:2012-02-07 08:22:42
【问题描述】:
在 C# (.NET 3.5) 中,我用我的数据库中的行填充了一个 DataTable。在这个 DataTable 中大约有 100 到 200 个 DataRows。我必须遍历这个 DataTable 来检查数据是否正确,我使用了 27 种检查方法。首先,我尝试将 DataTable 传递给每个方法并循环它。在我的第二次尝试中,我循环了 DataTable 一次并将 DataRow 传递给每个方法。后来我对这两种方法进行了基准测试,第一种方法比第二种方法快?
循环数据表 27 次耗时 13 秒。
循环 DataTable 1 耗时 18 秒。
那么对此有何解释?循环遍历 DataTable 以检查其数据的真正最快方法是什么?
注意:基准测试是在我开始检查方法之前开始的,以排除与数据库的连接速度。
第一种方法:
private void check()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
checkStamnr();
checkVoornaam();
checkGebDatum();
...
sw.Stop();
sw.Reset();
}
private void checkStamnr()
{
foreach (DataRow dr in dtIdentificatieRecords.Rows)
{
if (dr["STAMNRVOL"] == null || dr["STAMNRVOL"].GetType() == typeof(DBNull) || dr["STAMNRVOL"].equals(""))
{
DatabankFout df = new DatabankFout("Stamnummer is leeg.");
listDBFouten.Add(df);
}
}
}
第二种方法
private void check()
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
foreach (DataRow dr in dtIdentificatieRecords.Rows)
{
checkStamnr(dr);
checkVoornaam(dr);
checkGebDatum(dr);
...
}
sw.Stop();
sw.Reset();
}
private void checkStamnr(DataRow dr)
{
if (dr["STAMNRVOL"] == null || dr["STAMNRVOL"].GetType() == typeof(DBNull) || dr["STAMNRVOL"].equals(""))
{
DatabankFout df = new DatabankFout("Stamnummer is leeg.");
listDBFouten.Add(df);
}
}
类DatabankFout应要求:
public class DatabankFout
{
public DatabankFout(string reden, bool rood)
{
this.reden = reden;
this.rood = rood;
}
public DatabankFout(string reden) : this(reden, false)
{
}
public string reden { get; set; }
public bool rood { get; set; }
}
【问题讨论】:
-
没有看到任何代码就很难帮助...
-
你的
DatabankFout类有多重,listDBFouten是什么?要检查哪种方法更快,您应该删除两者中相同的所有不相关的。循环 100 行绝对不能持续 13/18 秒(除非您使用的是 C64),也许您使用了秒表并且在调试期间忘记了停止/重置(13 毫秒更现实)。而不是传递整个数据表或数据行,你应该只传递需要的东西——存储在数据列中的数据。 -
能否请您发布有关如何执行计时的代码。
-
DatabankFout只有一些属性,而 listDBFouten 是一个List<DatabankFout>,所以没有那么重。