在异常处理中,对性能的影响会随着try部分中的代码数量的增长而增加多少?

时间:2015-04-24 09:12:58

标签: c# c++ performance exception exception-handling

我将在c#中给出一个例子。

以下两个列表实现了同样的目的。情况2的情况肯定比情况1更好,因为try部分隔离了抛出异常的行。

我很想知道性能是否不同,如果是的话,它如何扩展到try部分中包含的代码数量?

最后,为什么会这样?

案例1:

        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
            data = (PlayerData)bf.Deserialize(file);
            file.Close();
        } catch (System.Runtime.Serialization.SerializationException e)
        {
            ...
        }

案例2:

        BinaryFormatter bf = new BinaryFormatter();
        FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
        try
        {
            data = (PlayerData)bf.Deserialize(file);
        } catch (System.Runtime.Serialization.SerializationException e)
        {

        }
        file.Close();

3 个答案:

答案 0 :(得分:1)

正如@jonathon所说,代码量对性能没有影响,发生异常会对性能产生影响。但要注意在try块中放置容易出错的代码,因为如果你不处理异常,CLR会获得你的应用程序的控制,这肯定是坏的和昂贵的。因为调用堆栈展开直到找到正确的catch,没有处理块(catch块)。

答案 1 :(得分:0)

try块中的代码量对性能没有影响。事实上,try块的存在将产生最小的影响。 .NET中的异常费用在它们被抛出时出现,并且运行时必须执行堆栈展开。

从您关注的电话中仅捕获您需要处理的一组例外。

在你的情况2中,你正在消除这种异常。那是你想要的吗?如果您只想确保文件已关闭,请使用不带catch语句的try / finally。

请参阅:

答案 2 :(得分:-1)

如果没有例外,尝试的性能成本非常小。 但在案例2中,你总是关闭文件,我认为这是更好的解决方案。如果发生的情况是1,一些异常文件也将被关闭,但后者当垃圾收集器释放你的FileStream对象时。