.net异常处理的性能问题

开发人员社区经常就异常处理的性能问题展开活跃争论。有人说异常处理性能很差,以至于他们根本就不打算使用。但是,我认为在面向对象平台中,异常处理不是一个可有可无的东西,而是必须的!另外,假若不用它,有什么是可以替代的呢?让方法返回bool值类型标识成功或失败,还是使用某种错误代码enum类型?如果真的这样做,那么两个世界中最坏的情况都会发生;CLR和类库都会抛出异常而你的代码会返回错误代码。现在你的代码两者都要应对。

异常处理和较常规的报告异常的方式相比,很难看出两者的性能差异。如果写代码检查每个方法调用的返回值,并将返回值“漏”给调用者,应用程序性能将受到严重影响。就算不考虑性能,由于要写代码检查某个方法的返回值,也必须进行大量额外的编程,而且出错的概率的概率也会大增。异常处理是一种好得多的方案。

然而,异常处理也是要付出代价的:非托管代码C++编译器必须生成代码来跟踪哪些对象被成功构造。编译器还必须生成代码,以便在一个异常被捕捉到的时候,调用每个已成功构造的对象的析构器。由编译器担负这个责任当然是最好的,但它会在应用程序中生成大量薄记代码,对代码的大小和执行时间造成负面影响。

另一方面,托管编译器就要轻松得多,因为托管对象是在托管堆中分配的,而托管堆受垃圾回收器的监视。如果一个对象成功构造,而且抛出一个异常,垃圾回收器最终会释放对象的内存。编译器无需生成任何薄记代码来跟踪成功构造的对象,也无需保证析构器的调用。与托管C++相比,这意味着编译器生成的代码更少,运行时要执行的代码更少,应用程序的性能更好。

猜你喜欢

转载自blog.csdn.net/aaawjie/article/details/109342850