3

printf私が作成するプログラムでは、モニター(または)に大量の印刷を行うと、実行にかかる時間が大幅に遅くなることに気付きましたfprintf (stderr, "...")

ディスクの物理的な制限のため、ディスクへの書き込みは遅くなると思いました。画面に印刷するとプログラムの速度が大幅に低下する理由がわかりません。

4

3 に答える 3

3

端末への書き込みは正確に高速ではなく、高速になるように設計されていません。通常、stdoutに送られるのは、ユーザーがどれだけ高速に読み取ることができるかに縛られているユーザー向けの情報だけだからです。

あなたが例えばで端末に書くとき。Linuxでは、次のようなことが起こります(たぶん)。カーネルは、2つの連続する各ステップの間に呼び出されます。

  1. プログラムは、データを書き込むために書き込みシステムコールを発行します。
  2. カーネルはターミナルエミュレータを再開し、ターミナルデバイスに書き込まれたデータを生成します
  3. ターミナルエミュレータはフレームの新しい状態をレンダリングし、これをXサーバーに送信します
  4. Xサーバーはメモリマップド表示領域を操作します
  5. カーネルは、グラフィックカードにバッファを交換するように指示します

そして、それらは多くのステップです...端末出力は通常ラインバッファリングされるだけなので、これはかなり頻繁に発生します。

于 2012-12-25T15:53:26.383 に答える
3

画面の種類、画面のサイズ、グラフィックカード、または出力が通過するものに応じて、はい、印刷物は実行時間にかなりの時間を追加する可能性があります。ディスクへの印刷は実際には高速である可能性が非常に高いです。ディスクは1秒あたり数メガバイトかかる可能性があります(最新のSATAドライブでは理論的には約300〜600MB /秒ですが、実際には、ディスクとしては遅かれ早かれそれよりも遅くなります。実際には、データをディスク内のプラッターに移動する必要がありますが、キャッシュも大きいため、16MBまたは32MBの書き込みにはかなりの時間がかかる場合があります)。コードにタイムスタンプを追加してみて(まだ追加していない場合)、と比較myprogmyprog > fileてくださいmyprog > /dev/null(またはNUL:ウィンドウの場合)そして、どちらがより時間がかかるかを確認します-画面に表示されるのは間違いありません-nullデバイスへの書き込みは最速ですが、ほんの少しです。

画面に印刷する際の最大の問題はスクロールです。これは「すべてをシャッフルする」ことを意味し、巧妙なハードウェアを使用しても、シャッフルするのにかなりのピクセル数になる可能性があります。最新のグラフィックカードは、2Dテキスト画面のスクロールとはまったく異なる方法で行われる3Dの描画をはるかに重視していることに注意してください。

そしてもちろん、それに加えて、完全に些細な関数ではないprintfまたは同様の関数を呼び出すため、アプリケーション自体に時間がかかります。したがって、多くのものを印刷する場合、printf自体に時間がかかります-プログラムの場合単純なコードでは、データが「null」になった場合でも、実際の作業にかかる時間の10倍になる可能性があります。

于 2012-12-25T15:53:34.730 に答える
2

printf()は通常、画面(端末)に印刷するときにラインバッファリングされるため、出力が遅くなります。

setvbuf()stdoutを使用するためのバッファサイズを設定できます。

于 2012-12-25T15:51:48.600 に答える