web-dev-qa-db-ja.com

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

Gitが非常に遅い理由の診断 記事には、この興味深い項目があります。

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

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

git config core.fscache true

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

16
Jonah Bishop

これがgit config --helpさんのコメント:

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

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

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

より技術的な説明はfscacheを導入したコミットにあります:
Win32:mingwのlstatとdirentの実装の下にキャッシュを追加

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

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

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

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

10
ge0rdi