find
grepの前にフォルダ(通常は大きくまたは自動的に作成されます)を除くいくつかの機能がbash環境で定義されています。一例は次のとおりです。
function grepsrc()
{
find . -type d -name .repo -prune -o \
-type d -name .git -prune -o \
-type f -iregex '.*\.\(h\|c\|cc\|cpp\|S\|java\|xml\|sh\|mk\|aidl\|vts\)' \
-exec grep --color=auto -n "$@" {} +
}
複数-o -iname
を使用する方が速いでしょうか-iregex
?
function grepsrc()
{
find . -type d \( -name .repo -o -name .git -o \) -prune -o \
-type f \( -iname '*.h' -o -iname '*.c' -o -iname '*.cc' -o \
-iname '*.cpp' -o -iname '*.S' -o -iname '*.java' -o \
-iname '*.xml' -o -iname '*.sh' -o -iname '*.mk' -o \
-iname '*.aidl' -o -iname '*.vts' \) \
-exec grep --color=auto -n "$@" {} +
}
私のテストによると、前者の平均時間は次のとおりです。
real 0m3.175s
user 0m3.021s
sys 0m0.145s
そして後者の平均は
real 0m3.170s
user 0m3.024s
sys 0m0.137s
したがって、私のデータセットには実際に大きな違いはありませんが、おそらく何かが欠けているでしょう。
ベストアンサー1
大きな違いはありません。
find
I/O バウンドであり、CPU バウンドではありません。すべての文字列操作(ワイルドカードや正規表現の一致など)は、ディスク操作よりも小さくなります。したがって、上記の結果が予想されます。
パフォーマンスに影響を与える可能性がある(そしてしばしば影響を与える)のは、find
テストの順序です。たとえば、ディレクトリを探している場合は、-type d
テストする前にディレクトリを移動してファイルを-name
表示する必要がないことを知らせて作業を高速化できます。find
ただし、名前の一致にのみ影響する変更は速度に大きな影響を与えません。