关于 - 小巧快速
小巧快速
**Git 速度很快**。使用 Git,几乎所有操作都在本地执行,这使其在与服务器不断通信的集中式系统中具有巨大的速度优势。
Git 是为了处理 Linux 内核而构建的,这意味着它从一开始就必须有效地处理大型仓库。Git 是用 C 语言编写的,减少了与高级语言相关的运行时的开销。速度和性能一直是 Git 从一开始的设计目标。
基准测试
让我们看看常见的操作如何与 Subversion 相比,Subversion 是一个常见的集中式版本控制系统,类似于 CVS 或 Perforce。越小越快。
为了测试,在同一可用区设置了大型 AWS 实例。Git 和 SVN 安装在两台机器上,Ruby 仓库被复制到 Git 和 SVN 服务器,并在两台服务器上执行常见操作。
在某些情况下,命令不完全匹配。在这里,尝试匹配最低公分母。例如,“commit” 测试还包括 Git 推送的时间,尽管大多数情况下您不会在提交后立即推送到服务器,而 SVN 中这两个命令无法分离。
所有这些时间都以秒为单位。
操作 | Git | SVN | ||
---|---|---|---|---|
提交文件 (A) | 添加、提交和推送 113 个修改后的文件 (2164+、2259-) | 0.64 | 2.60 | 4x |
提交图像 (B) | 添加、提交和推送一千个 1 kB 的图像 | 1.53 | 24.70 | 16x |
Diff 当前 | 与上次提交相比,Diff 187 个更改的文件 (1664+、4859-) | 0.25 | 1.09 | 4x |
Diff 最近 | 与 4 次提交相比 (269 个更改/3609+、6898-) | 0.25 | 3.99 | 16x |
Diff 标签 | 将两个标签互相 Diff (v1.9.1.0/v1.9.3.0) | 1.17 | 83.57 | 71x |
日志 (50) | 最近 50 次提交的日志 (19 kB 输出) | 0.01 | 0.38 | 31x |
日志 (全部) | 所有提交的日志 (26,056 次提交 - 9.4 MB 输出) | 0.52 | 169.20 | 325x |
日志 (文件) | 单个文件的历史记录日志 (array.c - 483 个修订版) | 0.60 | 82.84 | 138x |
更新 | 提交 A 场景的 Pull (113 个更改的文件、2164+、2259-) | 0.90 | 2.82 | 3x |
Blame | 单个文件的行注释 (array.c) | 1.91 | 3.04 | 1x |
请注意,这是 SVN 的最佳情况 - 服务器没有负载,并且与客户端机器的千兆位连接。如果连接速度较慢,那么这些时间中几乎所有时间都将更糟糕,而许多 Git 时间不会受到影响。
显然,在许多这些常见的版本控制操作中,**Git 的速度比 SVN 快一到两个数量级**,即使在 SVN 的理想条件下也是如此。
Git 在一个地方速度较慢,即在初始克隆操作中。在这里,Git 下载的是整个历史记录,而不仅仅是最新版本。如上图所示,对于仅执行一次的操作来说,它并没有明显慢得多。
操作 | Git* | Git | SVN | |
---|---|---|---|---|
克隆 | Git 中的克隆和浅克隆(*) 与 SVN 中的签出相比 | 21.0 | 107.5 | 14.0 |
大小 (MB) | 克隆/签出后客户端数据和文件总大小(以 MB 为单位) | 181.0 | 132.0 |
同样有趣的是,客户端数据的大小非常相似,即使 Git 还拥有项目整个历史的每个文件的每个版本。这说明了它在客户端压缩和存储数据方面的效率。