【发布时间】:2014-03-12 22:52:56
【问题描述】:
我正在对我的GaussQuadrature 模板类的一部分进行基准测试,方法是在循环中调用成员函数Quadrature 1M 次并对整个循环进行计时(如果您知道更好的方法,请告诉我!)。在这个类的预期应用中,构造函数将被调用一次,而例程将被调用多次,但我尝试在循环内部调用构造函数 1M 次,在外部调用一次只是为了看看哪个更快。
-
如果我在循环内调用构造函数,则每次迭代都会调用构造函数,但看起来它被分配到相同的内存空间(注意下面的 sn-p,构造函数内部有语句
std::cout << "ctor\n";) .这是巧合,还是更深层的原因?这是sn-p:for(int i = 0; i < 1000000; ++i) { GaussQuadrature<double> Q(N, func, a, b); // some arguments Q.Quadrature(); std::cout << "address: " << &Q << "\n"; }这给出了:
ctor address: 0x7fff23059400 ctor address: 0x7fff23059400 . . . ctor address: 0x7fff23059400
在没有循环或构造函数中的打印语句的情况下计时,即
clock_t tic = clock();
for(int i = 0; i < 1000000; ++i) {
GaussQuadrature<double> Q(N, func, a, b);
Q.Quadrature();
}
float elapsed = (clock() - (float)tic) / CLOCKS_PER_SEC;
std::cout << std::setprecision(10) << "time: " << elapsed << "\n";
结果
time: 12.47999954
-
现在,如果我改为在循环外调用构造函数,那么它当然只调用一次,但实际上需要更长的时间:
clock_t tic = clock(); GaussQuadrature<double> Q(N, func, a, b); for(int i = 0; i < 1000000; ++i) { Q.Quadrature(); } float elapsed = (clock() - (float)tic) / CLOCKS_PER_SEC; std::cout << std::setprecision(10) << "time: " << elapsed << "\n";这给了
time: 12.65999985
我运行了几次,结果相似。有什么想法吗?谢谢!
【问题讨论】:
-
现在的编译器非常聪明。使用循环内的构造函数,不会每次都创建对象,因为编译器知道它是相同的。而且它非常方便,因为这样你可以专注于干净的代码、作用域……如果你的对象 Q 没有在循环外使用,建议在循环内声明它。
标签: c++ performance class