c++ - 抛出C++0x异常的C++ 成本

  显示原文与译文双语对照的内容

在C++0x中引发异常的性能影响是什么? 这个编译器依赖多少? 这与请求进入 try 块的成本是一样的,即使没有任何异常引发异常也是如这里。

我们应该期望在像Java这样的一般逻辑处理中使用异常?

时间: 原作者:


#include <iostream>


#include <stdexcept>



struct SpaceWaster {


 SpaceWaster(int l, SpaceWaster *p) : level(l), prev(p) {}


//we want the destructor to do something


 ~SpaceWaster() { prev = 0; }


 bool checkLevel() { return level == 0; }


 int level;


 SpaceWaster *prev;


};



void thrower(SpaceWaster *current) {


 if (current->checkLevel()) throw std::logic_error("some error message goes heren");


 SpaceWaster next(current->level - 1, current);


//typical exception-using code doesn't need error return values


 thrower(&next);


 return;


}



int returner(SpaceWaster *current) {


 if (current->checkLevel()) return -1;


 SpaceWaster next(current->level - 1, current);


//typical exception-free code requires that return values be handled


 if (returner(&next) == -1) return -1;


 return 0;


}



int main() {


 const int repeats = 1001;


 int returns = 0;


 SpaceWaster first(1000, 0);



 for (int i = 0; i <repeats; ++i) {


 #ifdef THROW


 try {


 thrower(&first);


 } catch (std::exception &e) {


 ++returns;


 }


 #else


 returner(&first);


 ++returns;


 #endif


 }


 #ifdef THROW


 std::cout <<returns <<" exceptionsn";


 #else


 std::cout <<returns <<" returnsn";


 #endif


}



米老鼠基准测试结果:


$ make throw -B && time./throw


g++ throw.cpp -o throw


1001 returns



real 0m0.547s


user 0m0.421s


sys 0m0.046s



$ make throw CPPFLAGS=-DTHROW -B && time./throw


g++ -DTHROW throw.cpp -o throw


1001 exceptions



real 0m2.047s


user 0m1.905s


sys 0m0.030s



因此,在这种情况下,抛出异常 1000个栈级别,而不是正常返回,需要大约 1.5毫秒。 它的中包括输入,块,我相信在执行时是免费的,在每次输入试用函数时,只会产成成本。 对于更可以能的100个堆栈级别,我将重复到 10k,因为所有的东西都是30倍。 所以例外成本 0.1毫秒。

对于 10 000堆栈级别,它是 18.7 vs 4.1,因此异常的附加开销为 14ms 。 因此,对于这个例子,我们将看到一个相当一致的开销,即每层的堆栈。

显然C++0x没有为异常( 或者其他任何东西,除了算法和数据结构的Big-O 复杂性) 指定性能。 我认为它不会以严重的方式改变异常,这会严重影响许多实现。

原作者:
...