find -iregex が -o を複数使用するよりも高速ですか?

find -iregex が -o を複数使用するよりも高速ですか?

findgrepの前にフォルダ(通常は大きくまたは自動的に作成されます)を除くいくつかの機能が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

大きな違いはありません。

findI/O バウンドであり、CPU バウンドではありません。すべての文字列操作(ワイルドカードや正規表現の一致など)は、ディスク操作よりも小さくなります。したがって、上記の結果が予想されます。

パフォーマンスに影響を与える可能性がある(そしてしばしば影響を与える)のは、findテストの順序です。たとえば、ディレクトリを探している場合は、-type dテストする前にディレクトリを移動してファイルを-name表示する必要がないことを知らせて作業を高速化できます。findただし、名前の一致にのみ影響する変更は速度に大きな影響を与えません。

おすすめ記事