回复:http: //msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
有谁知道这是否是一个特别缓慢或锁定的操作,可能会影响大型环境中的服务器性能?
回复:http: //msdn.microsoft.com/en-us/library/system.io.file.exists.aspx
有谁知道这是否是一个特别缓慢或锁定的操作,可能会影响大型环境中的服务器性能?
在计算中,实际上不存在“昂贵的操作”之类的东西,除非你考虑到它与什么相关的昂贵。
例如,在现实世界中,2.000.000 美元购买一个物品会很贵吗?如果是巴哈马的价格呢?那会贵吗?一盒牛奶怎么样?那很贵吗?
您需要考虑的事情File.Exists
是,就您打算执行的整体操作而言,是否成本高昂,以及您是否真的有任何替代方案。
如果您没有任何替代品,它是否昂贵是否重要?
例如,如果您执行 1 检查文件是否存在,然后如果存在,则将其加载并花一个小时处理它,那么我认为它不会被认为是昂贵的。
但是,如果您在一个循环中调用它 10 次,以确定文件是否存在,然后如果存在,只需增加一个数字,那么它可能是您在那里执行的最昂贵的单个操作。
您可以确定的唯一方法是实际测量该方法调用所花费的时间,与您在同一操作中的其他时间相比。
在 2016 年,它似乎不是很贵,而且File.Exists
和PathFileExists
(为什么 File.Exists() 当文件不存在时要慢得多?)之间似乎也没有真正的区别。我可以测量的唯一区别是检查不存在的文件比检查现有文件更快:
(在 SSD 上测试)
[DllImport("Shlwapi.dll", SetLastError = true, CharSet = CharSet.Auto)]
private extern static bool PathFileExists(StringBuilder path);
void Main()
{
var sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
File.Exists(@"c:\Home\Temp\test_.log");
}
sw.Stop();
sw.Dump("File.Exists = false");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
File.Exists(@"c:\Home\Temp\test.log");
}
sw.Stop();
sw.Dump("File.Exists = true");
var sb = new StringBuilder(@"c:\Home\Temp\test_.log");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
PathFileExists(sb);
}
sw.Stop();
sw.Dump("PathFileExists = false");
sb = new StringBuilder(@"c:\Home\Temp\test.log");
sw = Stopwatch.StartNew();
for (int i = 0; i < 10000; i++)
{
PathFileExists(sb);
}
sw.Stop();
sw.Dump("PathFileExists = true");
}
锁号 慢,取决于您将其与什么进行比较。就 I/O 而言,它相当便宜,但与其他操作相比,I/O 总体上通常很慢。所以,如果你必须使用它,它不会伤害太严重。但是,我会尽量不要调用它超过真正必要的次数!:-)
我不认为是(文件操作在大多数操作系统上都经过高度优化和缓存),并且大多数其他操作更有可能是这里的罪魁祸首(套接字、数据库访问、一般处理等)。但是,像往常一样,最好的方法是实际分析您的应用程序并查看它是否是热点。
File.Exisits
用 kernel32.dll FindFirstFile 打开文件的处理程序。如果结果句柄无效,则返回 false。如果有效,它将用 LastAccessTime、CreationTime、文件大小等所有内容填充数据结构。然后返回真。什么都挡不住。
最好是在您的环境中运行一些测试。我有一个应用程序每秒可以执行 10,000+ 次,而不会对我的系统造成任何影响。我认为这相当快。