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