GCCの-pipeオプションはいつ使用する必要がありますか?
GCC 4.1.2ドキュメント には、-pipe
オプション:
-パイプ
コンパイルのさまざまな段階間の通信には、一時ファイルではなくパイプを使用します。これは、アセンブラーがパイプから読み取ることができない一部のシステムでは機能しません。しかし、GNUアセンブラは問題ありません。
私のシステムのアセンブラがパイプをサポートしていないかどうかをエラーメッセージから伝えることができると思うので、その問題に加えて、いつそのオプションを使用するかは重要ですか?使用を決定する際に考慮すべき要因は何ですか?
通常は違いはありません
+および-の考慮事項があります。歴史的に、コンパイラとアセンブラを同時に実行すると、RAMリソースにストレスがかかります。
Gccは今日の標準では小さく、-pipe
は、マルチコアでアクセス可能な並列実行を少し追加します。
しかし、同じトークンによりCPUは非常に高速であるため、気付かないうちにその一時ファイルを作成して読み戻すことができます。それ以来 -pipe
は決してデフォルトのモードではなく、時折少し動作します。通常、1人の開発者が時差に気付かないと報告します。
今、そこにはいくつかの大きなプロジェクトがあります。 Firefox、NetBSD、またはそのような何かを構築する単一のツリーをチェックアウトできます。たとえば、Xのすべてをマイナーサブシステムコンポーネントとして含むもの。ジョブが数千および数千のCファイルの数百万行のコードを含む場合、違いに気付くかもしれません。ご存知のように、人々は通常、一度にこのようなことのほんの一部にしか取り組みません。しかし、リリースエンジニアであるか、ビルドサーバーで作業している場合、または stdio.h、 で何かを変更している場合は、システム全体をビルドして、何かが壊れているかどうかを確認することをお勧めします。そして今、パフォーマンスの低下はすべてカウントされるでしょう...
中規模プロジェクトの経験では、-pipe
ビルド時間に識別可能な違いはありませんでした。いくつかの問題に遭遇しました(エラーが発生した場合に中間ファイルを削除できない場合があります、IIRC)。そのため、何も得られなかったため、これらの問題のトラブルシューティングを試みるのではなく、使用を中止しました。
今これを試してみると、ソース/ビルド先がNFS(Linuxネットワーク)上にある場合、ビルドが適度に高速になります。ただし、メモリ使用量は高くなります。 RAMを入力せず、NFSにソースがある場合は、-pipeを使用したほうが勝ちそうです。
正直なところ、使用しない理由はほとんどありません。 -pipeは少しのRAMのみを使用します。このボックスがコードを構築している場合、適切な量であると想定します。システムが、途中ですべての一時ファイル(たとえば、ext3)を書き込んでから削除する、より保守的なファイルシステムを使用している場合、ビルド時間を大幅に改善できます。
利点の1つは、-pipeを使用すると、コンパイラがファイルシステムと対話することが少なくなることです。ラムディスクの場合でも、一時ファイルを使用する場合、データはブロックI/Oおよびファイルシステムレイヤーを通過する必要がありますが、パイプを使用すると、データはもう少し直接になります。
ファイルを使用する場合、コンパイラはまずアセンブラを呼び出す前に書き込みを完了する必要があります。パイプのもう1つの利点は、コンパイラとアセンブラの両方を同時に実行でき、SMPアーキテクチャをもう少し活用できることです。特に、コンパイラがソースファイルからのデータを待機する必要がある場合(I/O呼び出しをブロックするため)、オペレーティングシステムはアセンブラに完全なCPU時間を与え、ジョブを高速化できます。