2011-02-10 6 views
4

私はCで実装する予定のプログラムを設計していますが、外部プログラムを呼び出すための最良の方法(パフォーマンスに関して)について質問があります。ユーザーは私のプログラムにファイル名を与えようとしているのですが、私のプログラムはそのファイルを入力として別のプログラムを実行しようとしています。私のプログラムは、他のプログラムの出力を処理します。Cのpopenのパフォーマンス

私の典型的なアプローチは、他のプログラムの出力をファイルにリダイレクトしてから、プログラムが完了したらそのファイルを読み込ませることです。しかし、I/O操作が非常に高価であることを理解しており、このプログラムをできるだけ効率的にしたいと考えています。

少し見ましたが、システムコマンドを実行して出力を取得するためにpopenコマンドが見つかりました。このアプローチのパフォーマンスと、今説明したアプローチのパフォーマンスとの比較popenは外部プログラムの出力を一時ファイルに書き込むか、プログラム出力をメモリに保存しますか?

また、パフォーマンスを向上させる別の方法がありますか?

+0

読み取りと書き込みのステップの相対的なパフォーマンスはどうですか?外部プロセスは処理できるよりも速く結果を生成しますか? –

答えて

7

Unixシステムでは、popenはメモリ内パイプを通じてデータを渡します。データがスワップアウトされないと仮定すると、ディスクにヒットしません。これは、呼び出されているプログラムを変更せずに得ることができるほどの優れたパフォーマンスを提供します。

+1

データを解析するプロセスがデータを生成するプロセスよりもはるかに遅い場合、パイプの解決策は悪いです。 –

+0

@Foo、必ずしも必要ではありません - データを作成するプログラムが常に高速であれば、それで、やはり同時に多かれ少なかれ仕上げることになるでしょう。 – bdonlan

+0

@Foo Bah:別々のファイルに書き込んだり処理したりするのは悪くありません。たとえライターがブロックしても、処理側は一定のデータ供給を有することができ、書き込み側が何かを書き込むとすぐに開始することができる。それは良い。書き込み側が一連の短いバーストで動作することは、通常、全経過時間や合計CPU使用率に悪影響を与えません。 –

2

popenはあなたが求めていることをほとんどしています:pipe-fork-exec idiomを実行し、読み書きできるファイルポインタを与えます。

ただし、パイプバッファーのサイズには制限があります(〜4K iirc)。すぐに読み取ることができない場合、他の処理がブロックされる可能性があります。

マウントポイントとして共有メモリにアクセスできますか? [Linuxシステムでは/ dev/shmマウントポイントがあります]

2

1)popenプログラム出力をメモリに保存します。実際にはパイプを使用してプロセス間でデータを転送します。

2)popenは、パフォーマンスのための最良のオプションとしてIMHOを探します。

また、レイテンシを短縮するファイルよりも利点があります。私。あなたのプログラムは、生成されている間に、その場で他のプログラムの出力を得ることができます。この出力が大きい場合は、他のプログラムが終了して出力処理を開始するまで待つ必要はありません。

0

ファイルが遅いディスク上にある場合は一時ファイルへの書き込み

が遅くなることがあります(UNIXまたはLinuxを仮定)。また、出力全体がディスクに収まる必要があることを意味します。

popenパイプを使用して他のプログラムに接続します。つまり、出力はプログラムに徐々に送信されます。それが生成されると、それはあなたのプログラムchunk-by-chunkにコピーされます。

2

サブコマンドをファイルにリダイレクトする際の問題は、popen通信を別のプロセスで傍受することはできないが、潜在的に安全でない可能性があるということです。さらに、マスタープログラムのいくつかのインスタンス(したがってサブコマンド)を実行している場合は、ファイル名が一意であることを確認する必要があります。 popenソリューションではこの問題は発生しません。

パフォーマンスがpopenの場合、1バイトのチャンクを読み書きしない限り、正常です。常に512の倍数(4096など)を読み書きします。しかし、それはファイル操作にも当てはまります。 popenは、プロセスと子プロセスをパイプで接続します。したがって、パイプを読み込まないと、パイプがいっぱいになり、子プロセスは書き込みできなくなります。交換されたデータはすべてメモリに保存されますが、それはわずかです。

関連する問題