В C# (.NET 3.5) Я заполнил DataTable строками из моей базы данных. В этом DataTable существует от 100 до 200 DataRows. Я должен пройти через этот DataTable, чтобы проверить правильность данных, и я использую 27 check-методов. Сначала я попытался передать DataTable каждому методу и зациклить его. Во второй попытке я зациклил DataTable один раз и передал DataRow каждому методу. Впоследствии я сравнивал эти два метода, и первый метод был быстрее второго?Цитирование через DataTable несколько раз
Looping the DataTable 27 раз занял 13 секунд.
Looping the 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; }
}
Трудно помочь без Seing кода ... –
Добавлен код ;-) – Yoni
Как тяжел ваш 'DatabankFout' класс и что такое' listDBFouten'? Чтобы проверить, какой метод выполняется быстрее, вы должны удалить все несвязанные, которые идентичны для обоих. Цикл 100 строк определенно не может длиться 13/18 секунд (если вы не на C64), возможно, вы использовали StopWatch и забыли остановить/сбросить во время отладки (13 миллисов более реалистично). Вместо того, чтобы передавать данные в формате wohole datatable или datarow, вы должны передавать только то, что необходимо - данные, хранящиеся в datacolumn. –