开发者

C++ ofstream vs. C++ cout piped to file

开发者 https://www.devze.com 2022-12-11 01:03 出处:网络
I\'m writing a set of unit tests that write calculated values out to files. Each test produces 开发者_如何学Pythona square matrix that holds anywhere from 50,000 to 500,000 doubles, and I have a total

I'm writing a set of unit tests that write calculated values out to files. Each test produces 开发者_如何学Pythona square matrix that holds anywhere from 50,000 to 500,000 doubles, and I have a total of 128 combinations of test cases.

Is there any significant overhead involved in writing cout statements and then piping that output to files, or would I be better off writing directly to the file using an ofstream?


This is going to be dependent on your system and environment. This likely to be very little difference, but there is only one way to be sure: try both approaches and measure them.


Since the dimensions involved are so large I'm assuming that these files are not meant to be read by a human being? Just make sure you write them out as binary and not human-readable text because that will make so much more difference than the difference between using ofstream or piping cout.

Whether this means you have to use ofstream or not I don't know. I've never written binary to cout so I can't say whether that's possible...


As Charles Bailey said, it's implementation dependent; what follows is mostly for linux implementation with gnu toolchain, but I hardly imagine it being very different in other os.

In libstdc++ 4.4.2:

  • An fstream contain an underlying stdio_filebuf which is a basic_filebuf. This basic_filebuf contain it's own buffer by inheriting basic_streambuf, and actually contain a __basic_file, itself containing an underlying plain C stdio abstraction (FILE* or std::__c_file*), in which it flush the buffer.

  • cout, which is an ostream is initialized with a stdio_sync_filebuf itself initialized with the C file abstraction stdout. stdio_sync_filebuf call plain C stdio functions.

Considering only C++, it appear that an fstream may be more efficient thanks to two layers of buffer.

Considering C only, if the process is forked with the stdout file descriptor redirected in a file, there should be no difference between writing to a new opened file (what fstream does at the end) or to stdout since the fd point to a file anyway (what cout does at the end).

If I were you, I would use an fstream since it's your intent.

0

精彩评论

暂无评论...
验证码 换一张
取 消