2017年微軟對Git性能提升的貢獻
Visual Studio團隊服務上託管著世界上最大的Git代碼倉庫:Windows操作系統源代碼。(小編註:Linux操作系統源代碼暫時還沒有使用Git管理)把這份代碼託管在雲上,並且允許超過4000位開發者同時更新代碼是一件了不起的事情。不過這樣的能力想要有用,前提是各位開發者的電腦上的Git客戶端能夠處理這麼大的代碼庫。為此,我們構建了GVFS系統。
從規模上說,Windows操作系統的代碼庫比其他任何Git倉庫都大,也因此在使用中暴露了Git核心的一些性能問題。我們需要修復這些性能問題,以便在Windows項目中可以順利使用。感謝Git開放了源代碼,我們會為所有Git用戶改善Git的性能,並且把我們所做的性能提升提交給Git社區。
回顧2017年我們為Git做的事情和取得的成就,我想分享一些我最喜歡的點滴,希望大家也能夠喜歡。
索引
Git的索引是一個文件的列表,列表中的文件用對象哈希值表示,包含的文件為已經提交過的文件和準備提交的文件,準備提交的文件就是我們通常所說的stage狀態的文件。很多Git操作都是先把這個索引載入到內存中,然後再進行相應的操作。我們找到了幾種方法來加速索引操作。
索引是路徑的有序列表,每新增加一個索引,Git都會去檢查以確保索引還是保持有序的。跳過這個檢查,索引的載入速度整體提升了18%。當索引重建時,這些路徑會以正確的順序重新排序。Git會檢測插入的文件有沒有重複,但是重複的文件在順序上總是相鄰的。所以排重這個步驟我們會先檢查前一個文件,必要時再進行二分查找,這樣我們使得索引寫入速度提升了20%。我們還優化了刪除索引和重新載入索引的操作。
我們還做了一些小的優化,加速了索引的每一次讀取和寫入。其中的兩個例子就是,在計算merge時我們使用哈希值而不是整個列表,並且用棧代替了堆分配。
狀態和檢出(checkout)
兩個非常常用的Git命令就是status和checkout。status命令檢查當前工作目錄和上一次提交的代碼之間的差異,checkout命令更新當前工作目錄到某一次提交的狀態。這些操作經常使用,同時在大型項目上性能不佳。
很多工具,比如Visual Studio團隊瀏覽器使用status命令來獲取可以提交的修改。很多項目中有很多文件夾是被git忽略的,因為它們被添加到了.gitignore中。團隊瀏覽器使用特殊的標識來表示這些被忽略的文件,這些被忽略的文件往往比倉庫中的源代碼文件還要多。我們給status命令增加了一個新的標籤,使得status命令的速度大幅提升,現在其他工具也可以使用更高效的status命令了。我們測試了我們的代碼,對於 git status -ignored 這個命令,性能提升超過50%。
即便我們做了這些優化,我們還是要訪問文件系統才能獲取到寫入文件的當前狀態。最終,我們需要給git增加一個文件系統監控插件,這個插件給git提供了一個額外的命令,這個命令可以計算文件系統改動的一個快照。雖然我們主要是為GVFS集成該功能,但是你還是可以將該功能和watchman一起使用。
縮寫
很多Git命令以縮寫的形式展現對象哈希,以便於人類能夠更容易地閱讀。同時,這個縮寫需要足夠長,以便保持唯一性。對於大型項目,計算縮寫成為了操作中很耗時的部分。舊的縮寫計算演算法會遍歷所有以該縮寫開頭的哈希值,只要碰到重合的情況就增加一位長度,直到該縮寫確實只表示某一個對象而沒有歧義了。而新的演算法是通過有效的二分查找,找到最相近匹配的共同前綴長度。這個演算法的提升,給像 git log --oneline 這樣的命令帶來了5%的性能提升。
Git用兩種方法存儲它的對象:packfiles和松對象。松對象以一個文件一個對象的方式存儲在.git/objects/??文件夾中,其中??是十六進位對象哈希的前兩位。當GVFS按需下載對象時,它把下載的對象按照松對象的形式處理。通常情況下,在git自動把松對象打包為packfiles之前,倉庫中松對象的數量不會很大。但是在GVFS的使用場景中,這個數量可以達到百萬量級。當計算簡寫時,Git為這些文件夾中的松對象在內存中做了一個緩存列表。當創建這個列表時,列表中的字元串使用普通的格式化字元串語法在末尾追加內容,有時候這個操作可以耗費到12%的CPU。我們簡單地用append方法替代了它,很輕鬆地獲得了一定程度的性能提升。
這只是一個開始
這不是我們在2017年做全部改進。你可以閱讀我們早先的文章:
在Windows2.11中Git做了哪些改進?(https://blogs.msdn.microsoft.com/devops/2016/12/01/whats-new-in-git-for-windows-2-11/)
在GVFS以外,我們對Git做了哪些優化?
(https://blogs.msdn.microsoft.com/devops/2017/05/30/optimizing-git-beyond-gvfs/)
微軟全力押注Git,努力使它成為微軟項目的首選版本控制工具。我們努力為全體程序員改進Git,並且接下來的幾個月甚至一年中,我們還會發布一些重大的改進。感謝Git社區的志願者們,感謝你們的耐心溝通和持續幫助,保證了我們的改進能夠順利回饋給Git社區。
英文原文:https://blogs.msdn.microsoft.com/devops/2018/01/11/microsofts-performance-contributions-to-git-in-2017/
譯者:詩書塞外


TAG:Python部落 |