代码之家  ›  专栏  ›  技术社区  ›  Geo

与在try、catch块之外运行代码相比,有什么性能优势吗?

  •  1
  • Geo  · 技术社区  · 15 年前

    我很想知道我是否应该最小化进入try/catch块的代码,或者它真的不重要。

       public bool ObjectExists(string stringTest, string againSomethingElse)
        {
            if(true) {}
            else {} //Code here is better/worst/same
            try
            {
                //Versus code inside try/catch block
    
            }
            catch (Exception)
            {
    
                throw;
            }
        }
    
    4 回复  |  直到 15 年前
        1
  •  10
  •   recursive    15 年前

    在.NET中,只有在实际引发异常时,Try/Catch才会产生开销。因此,不要太担心将代码放在 try . 只是不要将异常作为流控制的一种形式抛出。

        2
  •  6
  •   Eric Lippert    15 年前

    这是解决这个问题的正确方法。

    首先编写代码,以使异常处理正确。总是正确第一。

    然后设定合理的、以客户为中心的绩效目标。然后测试你的程序。然后,如果你还没有达到你的目标,使用一个分析器来找到最慢的事情。如果一些奇怪的巧合导致的最慢的事情恰好是您正确的异常处理,那么您甚至应该考虑异常处理的性能成本是多少。

        3
  •  3
  •   James Black    15 年前

    我同意递归,但您可能希望看到一个很好的解释: http://www.programmersheaven.com/user/pheaven/blog/175-Do-trycatch-blocks-hurt-runtime-performance/

    基本上,使用try..catch没有问题,但是,我倾向于限制我在其中所拥有的内容,因为我认为依赖它们是不好的做法,而不是尽你所能确保不会抛出异常,因为异常会很昂贵,因此,在获取字符串长度之前,请检查该字符串是否为空。

        4
  •  3
  •   Jack Marchetti    15 年前

    我同意上面的观点,但您不应该将整个代码块放在try catch中,让它捕获一个formatException或空引用。您应该为它们编写代码,并自己处理它们。

    我不知道我见过多少次:

    try {
     Request.QueryString["id"].ToString();
    }
    

    显然,如果id为空,则为空引用,因此请检查它是否为空,不要尝试/catch它。