在没有例外的情况下,C ++exception以何种方式减慢代码?
我读过使用C ++exception进行exception处理的开销,而不是检查返回值。 我只是谈论没有抛出exception时发生的开销。 我还假设你需要实现实际检查返回值的代码,并执行相应的操作,无论这些操作与catch块的操作相同。 而且,比较抛出exception对象和内部45个状态variables的代码到每个错误都返回一个负整数的代码也是不公平的。
我并不是试图为C ++exception构build一个案例,而仅仅基于哪一个可能执行得更快。 一旦你考虑了检查返回值和处理错误所需要的所有额外的簿记代码,我最近听说有人提出这样的例子:使用exception的代码应该和基于返回码的代码一样快。 我错过了什么?
在某些平台和某些编译器上,有一些与exception处理相关的成本。
也就是说,Visual Studio在构build32位目标时,将在每个具有局部variables的函数中注册一个处理程序,并使用非平凡的析构函数。 基本上,它build立了一个try/finally
处理程序。
gcc和Visual Studio以64位为目标的另一种技术只有在引发exception(该技术涉及遍历调用堆栈和表查找)时才会导致开销。 在很less抛出exception的情况下,这实际上可以导致更高效的代码,因为不必处理错误代码。
只有尝试/抓住和尝试/除了阻止几个指示设置。 除了最高循环之外,每种情况下的开销一般都可以忽略不计。 但是你通常不会使用try / catch /除非在内部循环中。
我build议不要担心这一点,并使用探查器来优化您的代码在需要的地方。
它完全依赖于实现,但是当不抛出exception时,许多最近的实现几乎没有性能开销。 其实你是对的。 正确检查所有不使用exception的代码中的所有函数的返回码可能会比使用exception的代码无所事事。
当然,您需要确定您的特定需求的性能。
有一些额外的开销(正如其他答案指出的那样)。
但是你现在没有多lessselect。 尝试在项目中禁用exception,并确保所有从属代码和库可以编译和运行没有。
他们与exception禁用?
让我们假设他们做! 然后对某些情况进行基准testing,但请注意,您必须设置“禁用例外”编译开关。 没有那个开关,你仍然有开销 – 即使代码从不抛出exception。
只有开销是〜6个指令,在函数启动时增加2个SEH,并留在最后。 无论在线程中有多less次尝试/抓取,总是一样的。
还有关于局部variables的是什么? 我听到人们在使用try / catch时总是抱怨他们。 我不明白,因为解构器最终会被调用。 另外,你不应该让exception超过1-3个电话。
我把Chip Uni的testing代码和扩展了一下。 我把代码分成两个源文件(一个有例外;一个没有)。 我使每个基准testing运行1000次,并使用clock_gettime()
和CLOCK_REALTIME
来logging每次迭代的开始和结束时间。 然后我计算了数据的均值和方差。 我运行64位版本的g ++ 5.2.0和clang ++ 3.7.0,在带有16GB内存的Intel Core i7机器上运行这个testing,运行ArchLinux和内核4.2.5-1-ARCH。 你可以在这里find扩展的代码和完整的结果。
克++
没有例外
- 平均值:30,022,994纳秒
- 标准偏差:1.25327e + 06纳秒
例外
- 平均值:30,025,642纳秒
- 标准偏差:1.83422e + 06纳秒
铛++
没有例外
- 平均值:20,954,657纳秒
- 标准偏差:426,662纳秒
例外
- 平均值:23,916,638纳秒
- 标准偏差:1.72583e + 06纳秒
C ++exception只会导致铿锵语++的不平凡的性能损失,甚至惩罚只有~14%。