2

計算された値をファイルに書き込む一連の単体テストを作成しています。各テストは、50,000 から 500,000 の double を保持する正方行列を生成し、合計 128 のテスト ケースの組み合わせがあります。

cout ステートメントを作成してその出力をファイルにパイプすることに関連する大きなオーバーヘッドはありますか、それとも ofstream を使用してファイルに直接書き込む方がよいでしょうか?

4

3 に答える 3

8

これは、システムと環境に依存します。これはおそらくほとんど違いがありませんが、確かな方法は 1 つしかありません。両方のアプローチを試して測定することです。

于 2009-11-08T16:07:30.287 に答える
1

関係する次元が非常に大きいので、これらのファイルは人間が読むことを意図していないと思いますか?人間が読めるテキストではなく、バイナリとして書き出すようにしてください。これは、ofstreamとpipingcoutの使用の違いよりもはるかに大きな違いが生じるためです。

これがあなたがofstreamを使わなければならないことを意味するかどうかはわかりません。私はcoutにバイナリを書いたことがないので、それが可能かどうかはわかりません...

于 2009-11-08T17:02:40.213 に答える
0

チャールズ・ベイリーが言ったように、それは実装に依存します。以下は、主に gnu ツールチェーンを使用した Linux の実装に関するものですが、他の OS で大きく異なるとは考えにくいです。

libstdc++ 4.4.2:

  • fstream には、basic_filebuf である基礎となる stdio_filebuf が含まれています。この basic_filebuf には、basic_streambuf を継承することによって独自のバッファーが含まれており、実際には __basic_file が含まれており、それ自体に、バッファーをフラッシュする基本的なプレーン C stdio 抽象化 (FILE* または std::__c_file*) が含まれています。

  • ostream である cout は、C ファイル抽象化 stdout で初期化された stdio_sync_filebuf 自体で初期化されます。stdio_sync_filebuf プレーンな C stdio 関数を呼び出します。

C++ だけを考えると、2 層のバッファーのおかげで fstream の方が効率的であるように見えます

C のみを考慮すると、ファイルにリダイレクトされた stdout ファイル記述子でプロセスがフォークされた場合、新しく開かれたファイル (fstream が最後に行うこと) への書き込みと stdout への書き込みの間に違いはないはずです。 (cout が最後に行うこと)。

私があなただったら、あなたの意図から fstream を使用します。

于 2009-11-08T20:56:38.987 に答える