Windows 7 のファイルシステム キャッシュは何をするのですか?

Windows 7 のファイルシステム キャッシュは何をするのですか?

Git が遅い理由を診断するこの記事には次のような興味深い項目があります:

ファイルシステムキャッシュを有効にする

Windows のファイルシステム レイヤーは、Linux のものと本質的に異なります (Linux では Git のファイルシステム アクセスが最適化されています)。回避策として、Git for Windows は、初期の「ウォームアップ」後に多くの場合操作を高速化するファイルシステム キャッシュを提供します。リポジトリごとにファイルシステム キャッシュをアクティブ化できます。

git config core.fscache true

Git でこのオプションを有効にすると、実際に何が変わりますか? Windows 7 のファイルシステム キャッシュはどのようになっているのでしょうか。また、何がキャッシュされているのでしょうか? 「初期ウォームアップ」には何が含まれますか?

答え1

ここにgit config --help書いてあるのは:

コア.fscache
一部の操作に対してファイル システム データの追加キャッシュを有効にします。

Git for Windows はこれを使用して、ディレクトリ全体の lstat データを一括読み取り、キャッシュします (ファイルごとに lstat を実行する代わりに)。

多くのファイルシステム要求を実行する代わりに、git はディレクトリ内のすべてのファイルに関する情報を取得するために 1 つの要求のみを実行します。

より技術的な説明は、以下を導入したコミットに記載されていますfscache
Win32: mingw の lstat および dirent 実装の下にキャッシュを追加します

Windows では、lstat エミュレーションが遅いため、作業ツリーの状態の確認に非常に時間がかかります (git はインデックス内のファイルごとに lstat を 1 回呼び出します)。Windows オペレーティング システム API は、単一のファイルをチェックするよりも、ディレクトリ全体の状態をスキャンする方がはるかに優れているようです。

lstat データにキャッシュを使用する lstat 実装を追加します。キャッシュ ミスは親ディレクトリ全体を読み取り、それをキャッシュに追加します。同じディレクトリに対する後続の lstat 呼び出しは、キャッシュから直接提供されます。

また、opendir / readdir / closedir を実装して、キャッシュ内にディレクトリ リストを作成して使用できるようにします。

キャッシュはファイル システムの変更を追跡せず、ファイルを変更する API にもプラグインしないため、作業コピーを変更しない git 関数に対しては明示的に有効にする必要があります。

関連情報