c# - 异常会降低性能吗?

标签 c# .net exception-handling

我的应用程序遍历目录树,并在每个目录中尝试打开具有特定名称的文件(使用 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/

相关文章:

sql-server - 恢复数据库备份时出错

java - 为什么会有项目特定的 RuntimeException?

c# - 试图回避单例/上帝/经理类。不过不确定我应该如何维持功能

c# - MVVM 会阻止 Visual Studio Designer 显示 xaml 的能力吗?

c# - 从日期/时间字符串中删除时间

c# - 将 SAFEARRAY 从 C# 传递到 COM

c# - 如何在 XDocument 中使用 XPath?

c# - 使用自定义分页器和XpsDocumentWriter的打印预览未显示在DocumentViewer中

.net - 当我使用实时应用保存对 web.config 的更改时会发生什么?

exception-handling - 如何在 python 中捕获 Joblib/并行异常?