解決WSL在Windows檔案系統下速度緩慢的問題
背景
微軟在比較 WSL 1 和 WSL 2 | Microsoft Docs這篇文章有提到,WSL 2在存取windows檔案系統時速度會變慢。雖然cd
/ls
這類指令無法察覺,但一旦使用到git,大量的檔案存取立刻讓效能有感變慢。有些用戶甚至還沒開始使用git指令,只是進入git repository,就足以讓接下來的每個指令延遲一秒以上。
分析原因
使用git會變慢的理由應該不用多談了,那為何單單只是進入git repository,速度就會有感下滑呢?這是因為很多的shell theme(bash/zsh),為了美觀和實用,都有附加「進入git repository時,提示目前branch」的功能。
而這也導致了在git repository底下時,無論輸入任何指令,shell皆會在每個指令間使用git指令,間接拖垮執行速度。
解決方法
思路
其中一個方案是回去用WSL 1,這也是微軟的推薦方法。
第二種方案則是改為使用windows的git,本篇主要會介紹這個方法。
首先要知道,任何windows的工具皆可在WSL中直接呼叫(前提是工具有在環境變數當中)。以git為例,若在Windows安裝過git,只要在WSL中輸入git.exe
,即可使用Windows的git。
$ which git.exe
/mnt/c/Program Files/Git/cmd/git.exe
因此只要利用這個特性,在WSL進入Windows檔案系統時,將原先的linux git替換為windows git,就不會再感到延遲了。
oh-my-zsh的解決方案
這裡提供oh-my-zsh的解決方案。
對原始碼有興趣的可以看看oh-my-zsh針對git所做的擴展,連結。
oh-my-zsh主要使用__git_prompt_git
此function來執行git操作。因此我們只要遮蔽此function,將git更改為windows版本,即可解決進入git repository時速度緩慢的問題。
當然,指令上的git也必須進行簡單替換,最後結果如下。
function __git_prompt_git() {
GIT_OPTIONAL_LOCKS=0 command git.exe "$@"
}
alias git="git.exe"
這樣一來不管是瀏覽git repository或是下git status等命令,都不會再感到緩慢。
這段程式應該放置在哪裡?有兩個選擇。
其一:若使用者完全不會用到linux檔案系統,可以考慮直接放在.zshrc之下。
其二:若使用者會交替使用Windows/Linux的檔案系統,可以考慮獨立一個檔案,假設將其命名為win.zsh
並將其放在家目錄下。然後在.zshrc之下多新增一個function。
function win() {
source $HOME/win.zsh
}
如此一來,只要在zsh中輸入 win
,即可切換為windows環境。
分享大概就到這邊。
留言
張貼留言