Я узнал, что обычно это "запах", когда вещи терпят неудачу около силы двух ...
Дано
За последние несколько недель я подвергся внезапному и значительному ухудшению производительности
и
AddExistingFile вызывается 66 914 раз
Мне интересно, снизилась ли производительность примерно в то время, когда количество файлов превысило 65 535 ...
Другие возможности для рассмотрения ...
Все 66,914 файлов находятся в одном каталоге? Если это так, то есть много блоков каталогов для доступа ... попробуйте дефрагментировать жесткий диск. На самом деле, это еще больше блоков каталогов, если они распределены по множеству каталогов.
Вы храните все файлы в одном списке? Вы настраиваете емкость этого списка или позволяете ему «расти» естественно и медленно?
Вы сначала сканируете файлы глубиной или шириной? Кэширование в ОС в первую очередь будет способствовать производительности глубины.
Обновление 14/7
Уточнение Вы храните все файлы в одном списке?
Наивный код, подобный этому первому примеру, не работает идеально, потому что ему нужно перераспределять пространство памяти по мере роста списка.
var myList = new List<int>();
for (int i=0; i<10000; i++)
{
myList.Add(i);
}
Более эффективно, если вы это знаете, инициализировать список с определенной емкостью, чтобы избежать издержек перераспределения:
var myList = new List<int>(10000); // Capacity is 10000
for (int i=0; i<10000; i++)
{
myList.Add(i);
}
Обновление 15/7
Комментарий от OP:
Эти веб-приложения программно не проверяют файлы на моем жестком диске, по крайней мере, не моей рукой. Если есть какое-либо рекурсивное сканирование файлов, это по VS 2008.
Сканирование файлов выполняет не Visual Studio - это ваше веб-приложение . Это хорошо видно на первой трассировке профайлера, которую вы опубликовали - вызов System.Web.Hosting.HostingEnvironment.Initialize()
занимает 49 секунд, в основном из-за 66 914 вызовов AddExistingFile()
. В частности, чтение свойства CreationTimeUTC
занимает почти все время.
Это сканирование не будет случайным - это либо результат вашей конфигурации приложения, либо файлы в дереве файлов веб-приложений. Найдите эти файлы, и вы узнаете причину проблем с производительностью.