在 try-catch 块中包装循环会导致性能问题吗? [复制]
Posted
技术标签:
【中文标题】在 try-catch 块中包装循环会导致性能问题吗? [复制]【英文标题】:Could wrapping a loop in a try-catch block cause performance problems? [duplicate] 【发布时间】:2015-07-24 16:12:26 【问题描述】:在将使用无限循环的游戏或其他应用程序中,将循环包装在 try
-catch
块中会损害性能吗?
类似这样的:
auto main() -> int
game::init();
try
while(1)
some_func();
some_other_func();
if(breaking_func())
break;
something_that_could_throw(); // unlikely, though
draw();
swap_buffers();
catch(const std::exception &err)
// do error handling
game::cleanup();
我标记了gcc
,但任何其他编译器也适用。
【问题讨论】:
您是否尝试过对代码进行基准测试或其他任何事情,看看会发生什么? @RickyMutschlechner 现在不可能,但有机会我会的 @CoffeeandCode:为什么“现在不可能”? 在询问我们之前,您应该花时间去做。如果这意味着您必须等待一段时间,那就这样吧。 :) @LightnessRacesinOrbit 因为我不在家,我很感兴趣 @NathanOliver 是的,我正要关闭它的副本。 【参考方案1】:好吧,将循环包装在 try catch()
块中,在进入 try
块时会给您带来小的性能损失,但不会执行循环中的各个迭代。
对比。一个未包装的版本,进入try
块需要编译器发出一些额外的指令才能进入定义的catch()
块之后。这些额外的指令与展开的循环相比会有(非常小的)性能差异。
即使将try catch()
应用到循环的内部,安装catch()
块入口点的开销也只会应用一次,而不是针对单个迭代。
【讨论】:
你能详细说明一下吗?为什么进入try
块会导致性能下降,为什么没有执行循环?
@Walter 因为需要安装 catch()
块的一些入口点,以便在抛出异常的情况下展开堆栈。
我同意@Walter;这个答案可以做一些充实。
@LightnessRacesinOrbit 从我的 nexus10 中提供最好的 ;-) ...以上是关于在 try-catch 块中包装循环会导致性能问题吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章