在 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 块中包装循环会导致性能问题吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Java虚拟机是如何处理异常的?

Java虚拟机是如何处理异常的?

啪啪,打脸了!领导说:try-catch必须放在循环体外!

啪啪,打脸了!领导说:try-catch必须放在循环体外!

在方便的方法中包装基于块的 API

在 foreach 循环中使用 try-catch 块的最佳做法是啥? [关闭]