web-dev-qa-db-ja.com

2回実行した場合、[find]が信じられないほど高速に実行されるのはなぜですか?

私のUbuntu/Linuxシステムのダッシュには、同じプログラムの2つのバージョンがあります。

Initial Problem

対応する。desktopファイルがどこにあるかを見つけるために私は使用しました

find / -type f -name 'Sublime Text.desktop' 2> /dev/null

ヒット数がゼロだったので、(成功して)やりました

find / -type f -name '[s,S]ublime*.desktop' 2> /dev/null

検索語は最初の検索語よりもかなり大きいはずなので、約3秒後に終了したことに驚きました。私にとっては静かなコーシャではなかったので、最初のコマンドをもう一度実行しましたが、驚いたことに、終了するのに約3秒しかかかりませんでした。

動作を確認するために、2番目のLinuxボックスの電源を入れ、最初のコマンドを再度実行しましたが、今回はtimeを使用しました。

time find -type f -name 'Sublime Text.desktop' 2> /dev/null 

Proof


findは、同じ検索語の検索を高速化するだけでなく、(同じパス内の)すべての検索を高速化します。 「関連のない」文字列の検索でさえ遅くなることはありません。

time find / -type f -name 'Emilbus Txet.Potksed' 2> /dev/null

Analyse RAM while before and after using find

検索プロセスをめちゃくちゃスピードアップするために、findは何をしますか?

5
Senkaku

2回目の検索が高速である理由は、Linuxがファイル caching を実行するためです。ファイルが最初にアクセスされるときはいつでも、ファイルの内容をメモリに保持します(もちろん、空きがある場合にのみそれを行いますRAM使用可能)。ファイルがで再度読み取られる場合後で、実際にファイルを再度読み取ることなく、メモリからコンテンツをフェッチすることができます。メモリアクセスはディスクアクセスよりもはるかに高速であるため、全体的なパフォーマンスが向上します。

つまり、最初のfindでは、ほとんどのファイルがまだメモリにないため、Linuxは多くのディスク操作を実行する必要があります。これは遅いので、少し時間がかかります。

findを再度実行すると、ほとんどのファイルとディレクトリがすでにメモリ内にあり、はるかに高速です。


2つのfind実行の間に キャッシュをクリア の場合、これを自分でテストできます。次に、2番目の検索は最初の検索より速くなりません。これが私のシステムでどのように見えるかです:

# This clears the cache. Be careful through, you might loose some data (Although this shouldn't happen, it's better to be sure)
$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3

$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,47s user 1,41s system 8% cpu 21,435 total

# Now the file names are in the cache. The next find is very fast:
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,19s user 0,28s system 69% cpu 0,673 total

# If we clear the cache, the time goes back to the starting time again
$ sync && echo 3 | Sudo tee /proc/sys/vm/drop_caches
3
$ time find /usr/lib -name "lib*"
find /usr/lib/ -name "lib*"  0,39s user 1,45s system 10% cpu 16,866 total
7
bennofs