【问题标题】:C++ ofstream vs. C++ cout piped to fileC++ ofstream 与 C++ cout 管道传输到文件
【发布时间】:2009-11-08 16:01:49
【问题描述】:

我正在编写一组将计算值写入文件的单元测试。每个测试都会生成一个方阵,可以容纳 50,000 到 500,000 个双精度数,我总共有 128 个测试用例组合。

在编写 cout 语句然后将输出通过管道传输到文件时是否存在任何重大开销,还是使用 ofstream 直接写入文件会更好?

【问题讨论】:

    标签: c++ cout ofstream


    【解决方案1】:

    这将取决于您的系统和环境。这可能差别很小,但只有一种方法可以确定:尝试两种方法并衡量它们。

    【讨论】:

      【解决方案2】:

      由于涉及的尺寸如此之大,我假设这些文件不适合人类阅读?只需确保将它们写成二进制而不是人类可读的文本,因为这将比使用 ofstream 或管道 cout 之间的区别大得多。

      这是否意味着您必须使用 ofstream 我不知道。我从来没有向 cout 写过二进制,所以我不能说这是否可能......

      【讨论】:

      • 嗯,另一个答案,另一个匿名投票。如果我不知道更好,我会说有人怀恨在心跟着我......
      【解决方案3】:

      正如 Charles Bailey 所说,它依赖于实现;以下主要是针对使用 gnu 工具链的 linux 实现,但我很难想象它在其他操作系统中会有很大不同。

      在 libstdc++ 4.4.2 中:

      • 一个 fstream 包含一个基础 stdio_filebuf,它是一个 basic_filebuf。这个basic_filebuf 通过继承basic_streambuf 包含它自己的缓冲区,实际上包含一个__basic_file,它本身包含一个底层的普通C stdio 抽象(FILE* 或std::__c_file*),它在其中刷新缓冲区。

      • cout,它是一个 ostream,使用 stdio_sync_filebuf 初始化,它本身使用 C 文件抽象 stdout 初始化。 stdio_sync_filebuf 调用纯 C 的 stdio 函数。

      仅考虑 C++,由于有两层缓冲区,fstream可能更高效。

      仅考虑 C,如果进程是在文件中重定向 stdout 文件描述符的情况下分叉的,则写入新打开的文件(fstream 在末尾执行的操作)或写入 stdout 之间应该没有区别,因为 fd 指向无论如何都是一个文件(cout 最后做了什么)。

      如果我是你,我会使用 fstream,因为这是你的意图。

      【讨论】: