我正在编写一组单元测试,将计算出的值写入文件。每个测试产生一个方形矩阵,可以容纳50,000到500,000的双倍,我总共有128个测试用例组合。
编写cout语句然后将输出汇总到文件是否有任何重大开销,或者我最好使用ofstream直接写入文件?
答案 0 :(得分:8)
这取决于您的系统和环境。这可能差别很小,但只有一种方法可以确定:尝试两种方法并测量它们。
答案 1 :(得分:1)
由于涉及的尺寸太大,我假设这些文件不是人类可以阅读的?只要确保你把它们写成二进制而不是人类可读的文本,因为这会比使用ofstream或者管道cout之间的区别更加不同。
这是否意味着你 使用ofstream或者我不知道。我从未写过二进制文件,所以我不能说这是否可能......
答案 2 :(得分:0)
正如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,用一个用C文件抽象标准输出初始化的stdio_sync_filebuf进行初始化。 stdio_sync_filebuf调用plain C stdio函数。
仅考虑C ++,由于两层缓冲区,似乎fstream 可能更有效。
仅考虑C,如果进程是使用重定向文件中的stdout文件描述符进行分叉,则写入新打开的文件(最后fstream执行的操作)或stdout之间应该没有区别,因为fd指向无论如何一个文件(cout最后做了什么)。
如果我是你,我会使用fstream,因为这是你的意图。