【问题标题】:Could wrapping a loop in a try-catch block cause performance problems? [duplicate]在 try-catch 块中包装循环会导致性能问题吗? [复制]
【发布时间】: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 是的,我正要关闭它的副本。

标签: c++ gcc c++14


【解决方案1】:

好吧,将循环包装在 try {} catch() {} 块中,在进入 try {} 块时会给您带来小的性能损失,但不会执行循环中的各个迭代。

对比。一个未包装的版本,进入try { } 块需要编译器发出一些额外的指令才能进入定义的catch() {} 块之后。这些额外的指令与展开的循环相比会有(非常小的)性能差异。

即使将try {} catch() {} 应用到循环的内部,安装catch() {} 块入口点的开销也只会应用一次,而不是针对单个迭代。

【讨论】:

  • 你能详细说明一下吗?为什么进入try 块会导致性能下降,为什么没有执行循环?
  • @Walter 因为需要安装 catch() {} 块的一些入口点,以便在抛出异常的情况下展开堆栈。
  • 我同意@Walter;这个答案可以做一些充实。
  • @LightnessRacesinOrbit 从我的 nexus10 中提供最好的 ;-) ...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多