4

В Dash моей системы Ubuntu/Linux есть две версии одной и той же программы.

Начальная проблема

Чтобы найти, где находятся соответствующие файлы .desktop , я использовал

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

Я получил ноль хитов, так что я сделал (с успехом)

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

Я был поражен, увидев, что он закончился примерно через три секунды, так как поисковый термин должен быть значительно длиннее, чем первый. Поскольку это не было тихим кошерным для меня, я снова выполнил первую команду, и, к моему удивлению, теперь потребовалось всего около трех секунд, чтобы закончить тоже.

Чтобы проверить поведение, я включил вторую коробку Linux и снова выполнил первую команду, но на этот раз со time

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

доказательство


find не только ускоряет поиск по одному и тому же поисковому запросу, но и все поиски (по одному и тому же пути?). Даже поиск "не связанной" строки не замедляется.

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

Анализировать оперативную память до и после использования find

Что делает находка, чтобы ускорить процесс поиска так безумно?

1 ответ1

6

Причина, по которой поиск происходит быстрее во второй раз, заключается в том, что linux выполняет кэширование файлов. Каждый раз, когда к файлу обращаются в первый раз, он сохраняет содержимое файла в памяти (конечно, он делает это только при наличии свободной оперативной памяти). Если файл снова будет прочитан позднее, он может просто извлечь содержимое из памяти без необходимости повторного чтения файла. Поскольку доступ к памяти намного быстрее, чем доступ к диску, это повышает общую производительность.

Так что при первом find большинство файлов еще не находятся в памяти, поэтому linux должен выполнять множество операций с диском. Это медленно, поэтому занимает некоторое время.

При повторном выполнении find большинство файлов и каталогов уже находятся в памяти, и это происходит намного быстрее.


Вы можете проверить это самостоятельно, если очистите кеш между двумя выполнениями поиска. Тогда вторая находка не будет быстрее первой. Вот как это выглядит в моей системе:

# 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .