1

現在、.o ごとに依存ファイルを生成しています。しかし、インクリメンタル ビルドを行う場合、Make は依存関係ファイルから各 .o の依存関係を読み取ります。Make はこれらの依存ファイルのタイム スタンプをチェックし、それを .o と比較していますか? もしそうなら、依存関係のステータスをキャッシュして、各オブジェクトファイルのステータスチェックが重複するために I/O ヒットが多すぎるのを避けることは可能ですか?

for example, 
a.o: h1.h h2.h
    gcc...
b.o: h1.h h2.h
    gcc...

ao をビルドするときに h1.h と h2.h のステータスをキャッシュすると、bo をビルドするときに 2 つのチェックを節約できますか?

私は make システムに精通していませんが、現在、大規模なレガシー C プロジェクトでそのパフォーマンスを改善する方法を探しています。

4

1 に答える 1

2

straceその目的のために使用します:

strace -e trace=stat make --touch

最初の実行の出力(フルビルド):

...
stat("a.o", 0x7fff70c35f00)             = -1 ENOENT (No such file or directory)
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
touch a.o
stat("b.o", 0x7fff70c35f00)             = -1 ENOENT (No such file or directory)
touch b.o

そして2回目の実行(インクリメンタルビルド):

...
stat("a.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h1.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("h2.h", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
stat("b.o", {st_mode=S_IFREG|0644, st_size=0, ...}) = 0
make: Nothing to be done for `all'.

ご覧のとおり、GNU Makeはタイムスタンプをキャッシュして、不要なシステムコールを回避しstatます。ただし、再帰makeを使用する場合は、状況はそれほど良くないと思います。

于 2012-08-09T21:16:14.600 に答える