У меня есть большой для цикла (30k максимум итераций), что, кажется, постоянно замедляется:.net большой цикл замедляя
- Первые тысячи итераций принимают 1.34s
- После 12k итераций, следующие тысячи принять 5.31s
- После 23K итераций, следующая тысяча принять 6.65s
- последние тысячи итераций принимают 7.43s
Для того, чтобы получить небольшую производительность, я переключился с цикла на цикл for
и попробовал настройку выпуска, но я не могу найти что-либо еще в this question, который применим ко мне. Петля находится в асинхронном методе
Почему цикл замедляется? Можно ли этого избежать?
for(int iter = 0; iter < LargeList1.Count; iter++)
{
var cl_from = LargeList1[iter];
if(LargeList2.Any(cl => cl.str.Contains(cl_from.str)))
{
DateTime dt1 = //last write time of a file
DateTime dt2 = //last write time of a different file
if(DateTime.Compare(dt1, dt2) > 0)
{
try
{
CopyFile(//Kernel32 CopyFile a file overwrite);
globals.fileX++;
}
catch(Exception filexx)
{
//error handler
}
}
else
{
globals.fileS++;
}
}
else
{
Directory.CreateDirectory(//create a directory, no check if it already exists);
try
{
CopyFile(//Kernel32 CopyFile a file do not overwrite);
globals.fileX++;
}
catch(Exception filex)
{
// error handler
}
}
gui.UpdateCount(globals.fileF, globals.fileX, globals.fileS); //updates iteration on textboxes
float p = (float)100.0*((float)globals.fileF + (float)globals.fileX + (float)globals.fileS)/(float)globals.totalCount;
gui.setProgress(p); //updates progressbar
}
Edit: как многие предложили, используя hashset.Contains (cl_from.str) решить эту проблему.
Что означает «итерации n-m take x»? Означает ли это * в любое время есть много итераций *, или * первые и последние c итерации принимают *? –
итерации 29k-30k принимают 7.43s означает, что последние 1000 итераций занимают 7.43 секунды. Я обновлю его, чтобы уточнить – Alex
Является ли это '7.43s' от начала итерации, или' 7.43s' от 'iteration 29k' до' iteration 30k'? –