Как вы справились со временем? Вы в отладчике? В режиме отладки? Похоже, вы используете DataTable
, поэтому я использовал ваш код в качестве шаблона для испытательного стенда (каждый раз создавая 1000 строк) и использовал жгут, как показано ниже, в режиме выпуска в командной строке ; результаты были следующими (число в скобках является проверкой, чтобы увидеть, что они оба сделали одну и ту же работу):
Yield: 2000 (5000000)
List: 2100 (5000000)
Испытательный жгут:
static void Main()
{
GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced);
int count1 = 0;
var watch1 = Stopwatch.StartNew();
for(int i = 0 ; i < 5000 ; i++) {
foreach (var row in MyYieldCollection)
{
count1++;
}
}
watch1.Stop();
GC.Collect(GC.MaxGeneration,GCCollectionMode.Forced);
int count2 = 0;
var watch2 = Stopwatch.StartNew();
for (int i = 0; i < 5000; i++)
{
foreach (var row in MyListCollection)
{
count2++;
}
}
watch1.Stop();
Console.WriteLine("Yield: {0} ({1})", watch1.ElapsedMilliseconds, count1);
Console.WriteLine("List: {0} ({1})", watch2.ElapsedMilliseconds, count2);
}
(обратите внимание, что обычно вы не должны использовать GC.Collect
, но в нем есть выравнивание поля для тестов производительности)
Единственное другое изменение, которое я сделал, было в цикле for
, чтобы избежать повторения:
int rows = tabinfo.Rows.Count;
for (int row = 0; row < rows; row++) {...}
Так что я не воспроизводлю ваши цифры ...