【发布时间】:2018-09-07 14:47:09
【问题描述】:
我的问题是,在程序结束时打开流并关闭它,或者每次我想使用它时打开它更好。 我举个例子。 这是一个简单的 Looger 类:
class Logger
{
Logger()
{
f.open("log.txt", std::ofstream::trunc);
}
~Logger()
{
f.close();
}
public:
static void log(const std::string& message)
{
static Logger l;
l.f<< message<<'\n';
}
private:
std::osftream f;
};
这样会更好吗?:
class Logger
{
Logger()
{
f.open("log.txt", std::ofstream::trunc);
f.close()
}
~Logger()
{
}
public:
static void log(const std::string& message)
{
static Logger l;
l.f.open("log.txt", std::ofstream::app);
l.f<< message<<'\n';
l.f.close();
}
private:
std::osftream f;
};
【问题讨论】:
-
打开和关闭文件是一项需要时间的操作(不是那么多,但可以衡量)。那么,不断打开和关闭文件的版本效率较低。
-
我怀疑保持打开状态是最快的,但唯一确定的方法是对其进行基准测试。此外,如果您想使用此日志来调试崩溃,您可能需要刷新。
-
效率是需要争取的,但有时您需要较慢的方法。第二个优点是文件在写入日志之间关闭,您可能需要这种行为的原因有很多。例如,您可以删除该文件或将其移动到另一个位置,这样您就可以为接下来计划的任何实验提供一个漂亮、干净的日志。
-
事实上,如果你使用logrotate 之类的东西,你可能应该不保持文件打开(尽管它确实有选项来补偿如果程序这样做的话)
-
这个问题没有明确的答案。这取决于您的效率衡量标准和可用资源(缓冲区内存、限制程序一次可以打开多少文件的配额等)与您的程序使用什么(同时打开多少文件流) 以及设备的性能和操作系统的缓存(例如,写入 RAM 驱动器比写入硬盘驱动器花费更少的时间,但消耗更多的系统内存)。
标签: c++ performance logging coding-style fstream