我正在编写自己的记录器。为了获得一些性能,我添加了一段代码来控制到std::ofstream
的刷新次数。为此,我使用了buffer
类型的临时std::stringstream
。日志操作首先写入此缓冲区,然后在正确的时间刷新到std::ofstream
。 (看void flushLog()
):
#include<iostream>
#include<sstream>
#include<fstream>
class BasicLogger
{
std::stringstream out;
std::ofstream logFile;
typedef std::basic_ostream<char, std::char_traits<char> > CoutType;
typedef CoutType& (*StandardEndLine)(CoutType&);
public:
BasicLogger(std::string id_){
std::string path = id_ + ".txt";
if(path.size()){
logFile.open(path.c_str());
if ((logFile.is_open() && logFile.good())){
}
}
}
BasicLogger& operator<<(StandardEndLine manip) {
std::cout << "Blogger:call to cout type oprtor" << std::endl;
manip(out);
return *this;
}
template <typename T>
BasicLogger & operator<< (const T& val)
{
std::cout << "Blogger:call to oprtor" << std::endl;
out << val;
if(out.tellp() > 512000/*500KB*/){// by some googling this estimated hardcode value promises less cycles to write to a file
flushLog();
}
return *this;
}
void flushLog()
{
if ((logFile.is_open() && logFile.good()))
{
logFile << out.str();
logFile.flush();
out.str(std::string());
}
}
};
知道std::ofstream
已经有了自己的缓冲区,如果操作缓冲区是正确的,我需要重新考虑。 ??
答案 0 :(得分:0)
您需要考虑日志文件不应该有太多的写入延迟,因为您需要能够在发生故障时检查最近的日志条目。
当您增加缓冲区大小时,输出缓冲的收益递减。从零到1个字节使你的速度加倍,因为它将系统调用减半;从1到4096或8192是一个主要的胜利,因为它对应于磁盘块大小;从8192到512k,根本不可能有太大的不同。我建议你在自己过度承诺之前对此进行基准测试。