首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

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/

译者:诗书塞外

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180119A06KG300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券