5

可能重复:
.NET 异常有多慢?

抛出异常并立即捕获它是否有开销?这有区别吗

void DoSomething(object basic)
{
    try
    {
       if (basic == null)
         throw new NullReferenceException("Any message");
       else
       {
         //...
       }
    }
    catch (Exception error)
    {
       _logger.WriteLog(error);
    }
}

还有这个(这里我们不抛出异常):

void DoSomething(object basic)
{
    try
    {
        if (basic == null)
        {
            _logger.WriteLog(new NullReferenceException("Any message");
            return;
        }
        else
        {
         ...
        }
    }
    catch (Exception error)
    {
        _logger.WriteLog(error);
    }
}

第二个片段会更快吗?

另外我想知道为什么一种解决方案比另一种更快。

4

3 回答 3

5

异常比所有其他程序流慢,但由于性能原因,它们没有达到应避免的程度。但是,它们并不打算用于程序流。在您的情况下,您有一个非常有效的替代方法,它比使用异常更好。当您可以预测情况并无例外地适当处理时,请始终这样做。另外,为了方便起见,不要在正常程序流程中使用异常。

当您遇到无法直接处理的意外异常情况时,请使用异常。

于 2012-09-10T14:08:28.863 回答
0

我收集到 Throw 的开销比 try/catch 多得多。我的意思是尝试/捕获几乎没有开销,但是一旦你真的必须捕获异常,就会有很小的开销。在许多程序中,您显示的两个选项都可以,但是如果您尝试真正分析您的代码,那么没有抛出它会更快。其他几个值得关注的问题:

在 C# 下,try、throw 和 catch 块对性能的影响有多大

C# 中 try/catch 的真正开销是什么?

于 2012-09-10T14:06:17.457 回答
0

在这种情况下,我认为第二种选择更快,但正如@Samuel Neff所说,异常非常慢。然而,当我阅读关于异常的Jon Skeet文章时,我发现了Krzysztof Cwalina的一篇有趣的文章:设计指南更新:异常抛出。,这解释了我们什么时候应该和不应该使用异常。事实上阅读它我发现一个重要的观点说:

1.2 例外与表现

与异常相关的一个常见问题是,如果将异常用于经常失败的代码,则实现的性能将是不可接受的。这是一个非常有道理的担忧。当成员抛出异常时,其性能可能会慢几个数量级。但是,在严格遵守不允许使用错误代码的异常准则的同时,可以获得良好的性能。本节中描述的两种模式建议了执行此操作的方法。

  • 不要使用错误代码,因为担心异常可能会对性能产生负面影响。
于 2012-09-10T14:33:23.970 回答