Minimalizate可见性VS避免初始化

时间:2014-01-17 21:21:20

标签: performance loops optimization initialization ofstream

为什么

for (int i=0; i<1e6; ++i)
{
    ofstream o("out.txt",ios_base::app);
    o<<i;
}

慢于

ofstream o("out.txt",ios_base::app);
for (int i=0; i<1e6; ++i)
{
    o<<i;
    o.flush()
}

?我认为第一个更快是因为o的可见性在第一种情况下比在第二种情况下更少,如果o的初始化成本太高,编译器会优化它并且基本上基于第二个创建二进制代码。通常,在循环内部或外部定义变量的建议是什么?在什么情况下有效Variables should be defined as late as possible!

我可以通过在以后不想使用的变量周围添加{}符号来改善程序的运行时间,以降低可见性,或者编译器可以轻松有效地维护这些信息,因此无需填写我的使用{}的代码?

1 个答案:

答案 0 :(得分:0)

在第一个循环中,每次循环构造并销毁ofstream。构造函数打开文件;析构函数刷新缓冲区并关闭文件。这些操作并不便宜。

在第二个循环中,构造ofstream一次,在循环的所有迭代中使用该一个对象,然后将其销毁一次(当它超出范围之后)。您只打开一次文件而只关闭文件一次。

编译器无法将第一个循环转换为第二个循环(反之亦然),因为它们不等效:打开和关闭文件是具有外部效果的动作。

通常,是的,您应该始终声明具有尽可能有限的范围的对象。但是这里有一些限制 - 当建造或拆除费用昂贵时,你应该避免构建超出你需要的物体。