我的应用程序遍历目录树,并在每个目录中尝试打开具有特定名称的文件(使用 File.OpenRead()
)。如果此调用抛出 FileNotFoundException
,则它知道该文件不存在。我是否宁愿在此之前调用 File.Exists()
来检查文件是否存在?这样会更有效率吗?
最佳答案
更新
我在循环中运行了这两种方法并分别计时:
void throwException()
{
try
{
throw new NotImplementedException();
}
catch
{
}
}
void fileOpen()
{
string filename = string.Format("does_not_exist_{0}.txt", random.Next());
try
{
File.Open(filename, FileMode.Open);
}
catch
{
}
}
void fileExists()
{
string filename = string.Format("does_not_exist_{0}.txt", random.Next());
File.Exists(filename);
}
Random random = new Random();
这些是没有附加调试器并运行发布版本的结果:
Method Iterations per second throwException 10100 fileOpen 2200 fileExists 11300
抛出异常的成本比我预期的要高很多,并且在不存在的文件上调用 FileOpen 似乎比检查不存在的文件是否存在要慢得多。
在文件通常不存在的情况下,检查文件是否存在似乎更快。我想在相反的情况下——当文件通常存在时,你会发现捕获异常的速度更快。如果性能对您的应用至关重要,我建议您根据实际数据对这两种方法进行基准测试。
如其他答案中所述,请记住,即使在打开文件之前检查文件是否存在,如果有人在您检查存在之后但就在您打开文件之前删除文件,您也应该注意竞争条件。您仍然需要处理异常。
关于c# - 异常会降低性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3946035/