Por que o [find] está sendo executado rapidamente, se executado duas vezes?

3

No Dash do meu sistema Ubuntu / Linux há duas versões do mesmo programa.

Paraencontrarondeosarquivos.desktopcorrespondentesestãolocalizados,usei

find/-typef-name'SublimeText.desktop'2>/dev/null

Eutenhozeroacertos,entãoeufiz(comsucesso)

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

Fiqueiespantadoaoverqueeleterminouapóscercadetrêssegundos,jáqueotermodepesquisadeveriasermaissignificativodoqueoprimeiro.Comonãoeraquietoparamim,eucorrioprimeirocomandodenovoeparaminhasurpresaagoralevouapenascercadetrêssegundosparaterminartambém.

Paraverificarocomportamento,ligueiumasegundacaixadoLinuxeexecuteioprimeirocomandonovamente,masdestavezcomtime

timefind-typef-name'SublimeText.desktop'2>/dev/null

find não apenas acelera a pesquisa do mesmo termo de pesquisa, mas de todas as pesquisas (dentro do mesmo caminho?). Mesmo a busca por uma String "não-relacionada" não é reduzida.

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

O que encontrar para acelerar o processo de pesquisa de forma tão insana?

    
por Senkaku 30.08.2013 / 23:10

1 resposta

5

A razão para encontrar é mais rápido na segunda vez é que o linux não arquiva cache . Sempre que um arquivo é acessado pela primeira vez, ele mantém o conteúdo do arquivo na memória (é claro que só faz isso quando você tem RAM livre disponível). Se o arquivo for lido novamente mais tarde, ele poderá buscar o conteúdo da memória sem realmente ter que ler o arquivo novamente. Como o acesso à memória é muito mais rápido do que o acesso ao disco, isso aumenta a performance geral.

Então o que acontece é que no primeiro find , a maioria dos arquivos ainda não estão na memória, então o Linux precisa fazer muitas operações de disco. Isso é lento, então leva algum tempo.

Quando você executa find novamente, a maioria dos arquivos e diretórios já está na memória e é muito mais rápida.

Você mesmo pode testar isso se limpar o cache entre as duas execuções de localização. Então o segundo achado não será mais rápido que o primeiro. Aqui está como fica no meu sistema:

# 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
    
por 30.08.2013 / 23:27