8

私はCでの出力に関する質問で誰かを助けていましたが、答えを(私の答えで)使用したかったこの一見単純な質問に答えることができませんでした。

C / C ++でファイルに出力する最速の方法は何ですか?

C++ と Java を使用して、素数の生成と数学的アルゴリズムの最適化について多くの作業を行ってきましたが、これが最大の障害でした。

これが答えられていたら許してください。

誰かがベンチマークの作業を行うとは思っていませんが、ファイルに入れる方法はいくつかあり、それらすべてを知っているとは思えません。

要約すると、

C および C++ でファイルに出力するにはどのような方法がありますか?

そして、これらのうちどれがより速いですか?

明らかに、コンソールからのリダイレクトはひどいものです。printfcout、などの簡単な比較fputcが役立ちます。

編集:

コメントから、

cout と printf の優れたベースライン テストがあります: cout と printf を組み合わせて出力を高速化する

これは素晴らしいスタートですが、私が求めていることに対する最良の答えではありません。たとえば、可能であれば、コメントに記載されている std::ostreambuf_iterator<> を処理しません。また、fputcを処理したり、コンソールのリダイレクトについて言及したりしません(比較するとどれほど悪いか)(必要があるわけではありません)

編集2:

また、私の過去のケースを議論するために、ほぼ無限の量のデータが出力されていると仮定することができます (新しい Intel i7 で文字通り何日も実行され、ギガバイトのテキストを生成するプログラム)

一時的なストレージは、ここでは非常に役立ちます。私が知っているように、ギガバイトのデータを簡単にバッファリングすることはできません。

4

4 に答える 4

2

私の知る限り、最大のボトルネックは一度に文字を書くことです (たとえば、fputc を使用)。これは、メモリ内にバッファを構築し、(fwrite を使用して) 全体をダンプすることと比較されます。経験上、fputc を使用して個々の文字を記述するとかなり遅くなることがわかりました。

これはおそらく、いずれかの関数が高速であるというよりも、ハードウェアの要因によるものです。

于 2013-11-14T16:47:35.087 に答える
1

cout はテンプレート関数であるため、実際には printf よりわずかに高速です。そのため、アセンブリは使用される型用にプリコンパイルされますが、速度の差はごくわずかです。あなたの本当のボトルネックは、言語の呼び出しではなく、ハードドライブの書き込み速度だと思います。本当にこれをやりたい場合は、データをバッファに保存するマルチスレッドまたはネットワーク ソリューションを作成し、データの処理とは別にハード ドライブにゆっくりとデータを書き込むことができます。 .

于 2013-11-14T16:45:30.297 に答える