2

私は現在、ソースCファイルを読み取り、対応するインクルードファイルを見つける小さなbashスクリプトに取り組んでいます。

ここで、マッピングMを見つける2つのモデルから選択する必要があります:ファイル名->{ファイルパスを含める}。私が持っているのは2つの配列です。1つはインクルードファイル名が見つかり、もう1つは可能なパスを含みます。オプションは次のとおりです。

a)1つのパスで各ファイルを探してから、別のパスに進みます。

b)パスのリストを調べて1つのファイルを見つけてから、別のファイルに進みます。

私の質問は-何が速くなるのか?それぞれの選択肢には同じ回数の反復がありますが、コマンドの中にはもっと時間がかかるものがあるのではないでしょうか。私は個人的にオプションa)を好みます。

助けてくれてありがとう、そしてこれがばかげた質問だったらごめんなさい。

4

3 に答える 3

1

一致が見つかったらキーワードを使用せずに、正しくコーディングしなかった場合にのみ、同じ量の反復が発生しますcontinue(外部ループにも影響を与える引数として数値を使用できることを忘れないでください)。

私はすべてのインクルードファイルを繰り返し処理し、いくつかの順序でパスを調べます-<system>インクルードは、検索システムが最初にパスをインクルードしてより迅速な結果を得る必要がありますが、インクルードについても同じことが言え"local"ます。解析中にこの情報を破棄することは賢明ではありません。

find -type fただし、すべてのインクルードパスで実行し、結果を一時ファイルまたは変数に保存するだけで、より良い結果が得られると思います。次にgrep、インクルード自体に対して(または同等の)それを実行します。このようにして、I / Oの半分が一度に一度だけ読み取られるため、I/Oを節約できます。

于 2012-10-13T22:16:28.033 に答える
1

あなたが何をすべきかはあなたの目標に依存しますが、それは私にはよくわかりません。ファイルを作成する場合は、前の回答で述べたように、おそらくmakedependを使用する必要がありmakeます。

代わりに、システムに複数のバージョンのヘッダーファイルがあるかどうかを確認したい場合は、locateコマンドの使用を検討してください。たとえば、私のubuntu 12.04 linuxシステムでは、次のコマンドが完了するまでに約1秒かかり、コマンドの下に示す出力が生成されます。

  $ locate stdio.h | grep usr/include
  /usr/include/stdio.h
  /usr/include/c++/4.6/tr1/stdio.h
  /usr/include/glib-2.0/glib/gstdio.h
  /usr/include/sharutils/stdio.h
  /usr/include/x86_64-linux-gnu/bits/stdio.h

ファイルpqrの別々の行にライブラリパスのリストがあり、ファイルxyzにヘッダーファイルのリストがある場合は、次のようなコマンドを使用できます。

  locate / | grep -f xyz | grep -f pqr

(必要に応じて、-Fと一緒に使用できます-f。)2行(stdio.hおよびstdlib.h)が入力されxyz、2行(/usr/include/および/usr/lib/)が入力されpqrている場合、コマンドは出力を生成するために私のシステムで.7秒かかります

  /usr/include/stdio.h
  /usr/include/stdlib.h
  /usr/include/c++/4.6/tr1/stdio.h
  /usr/include/c++/4.6/tr1/stdlib.h
  /usr/include/freetype2/freetype/config/ftstdlib.h
  /usr/include/glib-2.0/glib/gstdio.h
  /usr/include/sharutils/stdio.h
  /usr/include/sharutils/stdlib.h
  /usr/include/x86_64-linux-gnu/bits/stdio.h
  /usr/include/x86_64-linux-gnu/bits/stdlib.h
  /usr/lib/perl/5.14.2/CORE/nostdio.h
  /usr/lib/syslinux/com32/include/stdio.h
  /usr/lib/syslinux/com32/include/stdlib.h

一般的なLinuxシステムでは、ファイル名データベースは1日1回更新されることに注意してください。システムヘッダーファイルを探す場合、これはおそらく問題にはなりません。sudo updatedbより一時的なファイルの場合は、を使用する前に言う必要があるかもしれませんlocate。これにより、全体の時間が数秒から数分長くなります。

于 2012-10-14T00:02:48.753 に答える
0

インクルードファイルを見つけるには、特にmakefileを使用している場合は、専用のソリューションがmakedependになります。

于 2012-10-13T22:27:41.443 に答える