nがひとつ多い。

えぬなおの技術的なことを書いていくとこ。

【WSL2】WSL2でgitが遅いのをなんとかする

WSLとgit

WSL2を普段使っているが、大きなプロジェクトになるとgit statusが非常に遅いのがストレスになってきた。

❯❯❯ time git status
git status  0.05s user 2.60s system 44% cpu 6.010 total
❯❯❯ date '+%Y-%m-%dT%H:%M:%S.%3N' && git status && date '+%Y-%m-%dT%H:%M:%S.%3N'
2021-02-12T13:45:34.304
<snip>
2021-02-12T13:45:40.693

え・・・6秒・・・( ^ω^)

理由は単純

2021/1現在、WSL2上のファイルシステムへのLinuxシステムコールの発行/処理は遅い事で知られている。

github.com

中の仕組みを考えてみれば単純で、WSLはWindowsシステムコールLinuxシステムコールをバイパスしているので、まぁパフォーマンスを悪そうだとは思う。 linuxのgitコマンドではLinuxシステムコールから呼んで、Windowsシステムコールに変換して、ディスクにアクセスしてメモリに乗せて・・・みたいな事をするはずという話なんだ。

どうする?

ここで紹介されているようなhackをすればいい。

github.com

zshrcやbash_profileに以下を追記すれば終わり。

# checks to see if we are in a windows or linux dir
function isWinDir {
  case $PWD/ in
    /mnt/*) return $(true);;
    *) return $(false);;
  esac
}
# wrap the git command to either run windows git or linux
function git {
  if isWinDir
  then
    git.exe "$@"
  else
    /usr/bin/git "$@"
  fi
}

gitコマンドの時だけwindowsのgit.exeでアクセスしちゃうというハックで、筆者も「バカげた方法だが」と書いているがなんというか妥当な対処法だと思われる。 要はWindows側でインストールされたgit.exe経由でファイルの情報を引っ張って来れば無駄なシステムコールのバイパスが減るというわけだ。

デモ

git.exeという外部コマンドになるのでtimeコマンド使えない。という事でdateコマンドでも挟む

❯❯❯ date '+%Y-%m-%dT%H:%M:%S.%3N' && git status && date '+%Y-%m-%dT%H:%M:%S.%3N'
2021-02-12T13:47:18.445
<snip>
2021-02-12T13:47:18.526

処理が80ミリ秒くらいになった。これで快適。