我了解到,当事情失败接近于2的幂时,通常会出现“气味”...
考虑到:
在过去的几周中,我曾遭受突然而显著的性能下降
以及
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
原帖作者的评论:
这些 Web 应用程序并不是通过我的手动编程方式来探测硬盘上的文件。如果有任何递归文件扫描,那就是 VS 2008 在做。
进行文件扫描的不是 Visual Studio,而是你的 Web 应用程序。这在你发布的第一个分析器跟踪中可以清楚地看到——调用 System.Web.Hosting.HostingEnvironment.Initialize()
花费了 49 秒,其中大部分时间都花费在了 66,914 次调用 AddExistingFile()
上。特别是,读取属性 CreationTimeUTC
几乎占据了所有时间。
这种扫描不会是随机的——它要么是应用程序配置的结果,要么是文件位于你的 Web 应用程序文件树中。找到这些文件,你就会知道性能问题的原因。