На момент написания этого ответа ни один из предыдущих ответов не использовал Directory.EnumerateFiles(), который позволяет вам выполнять операции со списком файлов во время его создания. Код:
Parallel.ForEach(Directory.EnumerateFiles(path, "*", SearchOption.AllDirectories).AsParallel(), Item =>
{
if(!string.Equals(Path.GetExtension(Item), ".zip",StringComparison.OrdinalIgnoreCase))
File.Delete(Item);
});
насколько я знаю, прирост производительности от использования AsParallel() не должен быть значительным (если он обнаружен) в этом случае, однако в моем случае это имело значение.
Я сравнил время, необходимое для удаления всех файлов, кроме .zip, в списке из 4689 файлов, 10 из которых были zip-файлами с использованием 1-foreach. 2-параллельный foreach. 3-IEnumerable().AsParallel().ForAll. 4-параллельный foreach с использованием IEnumerable().AsParallel(), как показано выше. Результаты:
1-1545
2-1015
3-1103
4-839
пятый и последний случай был обычным foreach с использованием Directory.GetFiles()
5-2266
конечно, результаты не были окончательными, насколько я знаю, чтобы провести правильный бенчмаркинг, вам нужно использовать оперативную память вместо жесткого диска.
Примечание: разница в производительности между EnumerateFiles и GetFiles становится более очевидной по мере увеличения количества файлов.
person
ψευδή ηχώ
schedule
29.08.2013