我可以通过控制std :: ofstream中的缓冲区刷新来获得性能吗?

时间:2014-09-01 05:07:11

标签: c++ buffer ofstream

我正在编写自己的记录器。为了获得一些性能,我添加了一段代码来控制到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已经有了自己的缓冲区,如果操作缓冲区是正确的,我需要重新考虑。 ??

1 个答案:

答案 0 :(得分:0)

  1. 您需要考虑日志文件不应该有太多的写入延迟,因为您需要能够在发生故障时检查最近的日志条目。

  2. 当您增加缓冲区大小时,输出缓冲的收益递减。从零到1个字节使你的速度加倍,因为它将系统调用减半;从1到4096或8192是一个主要的胜利,因为它对应于磁盘块大小;从8192到512k,根本不可能有太大的不同。我建议你在自己过度承诺之前对此进行基准测试。