Que fait le cache du système de fichiers dans Windows 7?

16

L'article Diagnostiquer pourquoi Git est si lent contient cet article intéressant:

Activer le cache du système de fichiers

La couche du système de fichiers de Windows est intrinsèquement différente de Linux (pour laquelle l'accès au système de fichiers de Git est optimisé). Comme solution de contournement, Git pour Windows propose un cache de système de fichiers qui accélère les opérations dans de nombreux cas, après un "échauffement" initial. Vous pouvez activer le cache du système de fichiers par référentiel:

git config core.fscache true

Si j'active cette option dans Git, qu'est-ce qui change réellement? À quoi ressemble le cache du système de fichiers dans Windows 7 et qu'est-ce qui est mis en cache? Qu'implique le «réchauffement initial»?

Jonah Bishop
la source

Réponses:

10

Voici ce que git config --helpdit:

core.fscache
Activer la mise en cache supplémentaire des données du système de fichiers pour certaines opérations.

Git pour Windows l'utilise pour lire en masse et mettre en cache les données lstat de répertoires entiers (au lieu de faire lstat fichier par fichier).

Au lieu de faire de nombreuses requêtes sur le système de fichiers, git ne fera qu'une seule requête pour obtenir des informations sur tous les fichiers du répertoire.

Une description plus technique peut être trouvée dans commit qui a introduit fscache:
Win32: ajoutez un cache sous les implémentations lstat et dirent de mingw

La vérification de l'état de l'arborescence de travail est assez lente sous Windows, en raison de l'émulation lstat lente (git appelle lstat une fois pour chaque fichier de l'index). Les API du système d'exploitation Windows semblent être bien meilleures pour analyser l'état de répertoires entiers que pour vérifier des fichiers uniques.

Ajoutez une implémentation lstat qui utilise un cache pour les données lstat. Le cache manque de lire le répertoire parent entier et de l'ajouter au cache. Les appels lstat suivants pour le même répertoire sont servis directement à partir du cache.

Implémentez également opendir / readdir / closedir afin qu'ils créent et utilisent des listes de répertoires dans le cache.

Le cache ne suit pas les modifications du système de fichiers et ne se connecte à aucune API de modification de fichiers, il doit donc être explicitement activé pour les fonctions git qui ne modifient pas la copie de travail.

ge0rdi
la source