O que o cache do sistema de arquivos faz no Windows 7?

16

O artigo Diagnosticando por que o Git é tão lento possui este item interessante:

Ativar o cache do sistema de arquivos

A camada do sistema de arquivos do Windows é inerentemente diferente da do Linux (para a qual o acesso ao sistema de arquivos do Git é otimizado). Como solução alternativa, o Git for Windows oferece um cache do sistema de arquivos que acelera as operações em muitos casos, após um "aquecimento" inicial. Você pode ativar o cache do sistema de arquivos por repositório:

git config core.fscache true

Se eu ativar esta opção no Git, o que realmente muda? Como é o cache do sistema de arquivos no Windows 7 e o que está sendo armazenado em cache? O que implica o "aquecimento inicial"?

Jonah Bishop
fonte

Respostas:

10

Aqui está o que git config --help diz:

core.fscache
Habilite o cache adicional de dados do sistema de arquivos para algumas operações.

O Git for Windows usa isso para ler e armazenar em cache dados lstat de diretórios inteiros (em vez de executar lstat arquivo por arquivo).

Em vez de fazer muitas solicitações do sistema de arquivos, o git fará apenas uma solicitação para obter informações sobre todos os arquivos no diretório

Uma descrição mais técnica pode ser encontrada no commit que introduziu fscache:
Win32: adicione um cache abaixo das implementações lstat e dirent do mingw

A verificação do status da árvore de trabalho é bastante lenta no Windows, devido à emulação lenta do lstat (o git chama lstat uma vez para cada arquivo no índice). As APIs do sistema operacional Windows parecem ser muito melhores na verificação do status de diretórios inteiros do que na verificação de arquivos únicos.

Adicione uma implementação lstat que usa um cache para dados lstat. As falhas de cache leem todo o diretório pai e adicionam-no ao cache. As chamadas subseqüentes do lstat para o mesmo diretório são atendidas diretamente do cache.

Implemente também opendir / readdir / closedir para que eles criem e usem listagens de diretório no cache.

O cache não controla as alterações do sistema de arquivos e não se conecta a nenhuma API de modificação de arquivos, portanto, ele deve ser ativado explicitamente para funções git que não modificam a cópia de trabalho.

ge0rdi
fonte