不可忽略的 try-catch-finally 性能问题

是的,我曾以为try-catch-finally就类似一个if-else语句一样没有性能影响,然而实际并非如此。

首先,在没有抛出异常时,try-catch的影响与添加了一个if-else是同一个量级的。也就是说,我们完全可以忽视try catch耗费的那点性能。

然而当抛出异常时,CLR需要收集当前调用堆栈用来构造异常信息,这个调用堆栈用于描述异常是在何处创建的,以方便我们进行问题跟踪。而性能损失的地方就在于调用堆栈的构建。就像我们打dump获取内存快照分析问题一样,CLR也需要创建一份当时的内存快照来获取堆栈信息。而创建内存快照时又会挂起进程的,这势必又会加重了性能的损耗。

所以,当你明确可能要发生的异常时,就尽量在catch之前处理。如果必须捕捉异常,也请务必捕捉具体的异常,切勿捕捉一切异常。

try
{
    //some code logic
}
catch (Exception e)//避免这样处理
{
    Logger.Log(e.Message);
    throw;
}

猜你喜欢

转载自blog.csdn.net/weixin_33749242/article/details/86894459
今日推荐