【发布时间】:2009-11-08 16:01:49
【问题描述】:
我正在编写一组将计算值写入文件的单元测试。每个测试都会生成一个方阵,可以容纳 50,000 到 500,000 个双精度数,我总共有 128 个测试用例组合。
在编写 cout 语句然后将输出通过管道传输到文件时是否存在任何重大开销,还是使用 ofstream 直接写入文件会更好?
【问题讨论】:
我正在编写一组将计算值写入文件的单元测试。每个测试都会生成一个方阵,可以容纳 50,000 到 500,000 个双精度数,我总共有 128 个测试用例组合。
在编写 cout 语句然后将输出通过管道传输到文件时是否存在任何重大开销,还是使用 ofstream 直接写入文件会更好?
【问题讨论】:
这将取决于您的系统和环境。这可能差别很小,但只有一种方法可以确定:尝试两种方法并衡量它们。
【讨论】:
由于涉及的尺寸如此之大,我假设这些文件不适合人类阅读?只需确保将它们写成二进制而不是人类可读的文本,因为这将比使用 ofstream 或管道 cout 之间的区别大得多。
这是否意味着您必须使用 ofstream 我不知道。我从来没有向 cout 写过二进制,所以我不能说这是否可能......
【讨论】:
正如 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,因为这是你的意图。
【讨论】: