모두가 Git의 장점으로 'Git은 빠르다'라고 내세운다. 다른 SCM의 맹신자들도 Git이 빠르다고 인정한다. Git의 모든 오퍼레이션은 로컬에서 수행된다. 네트워크가 필요한 SVN과 Perforce이 뛸 때 날고 있는 셈이다. 게다가 Git은 로컬에서 명령을 수행하는 다른 DSCM과 비교해도 빠르다.
처음 개발할때 부터 리눅스 커널에 사용할 목적이 였기 때문에 규모가 큰 레파지토리일 수록 더욱 효과적이다. 게다가 Git은 C로 작성돼있어서 고수준 언어가 만들어내는 오버헤드도 없다. Git을 만든 선구자들은 '빠른 것'을 설계 목표중 하나로 삼았다.
나는 몇 가지 벤치마크 테스트를 진행했다. Git, Mercurial, Bazaar 이렇게 세가지 SCM에 각각 Django source code를 올려놓고 테스트를 했다. 나는 또한 SVN으로도 이 중 몇가지 테스트를 진행했다. 내가 장담컨데 SVN은 느리다. 기본적으로 Bazaar의 결과에 네트워크 레이턴시(Latency)를 더해야 한다.
결론부터 말하자면 파일을 새로 추가하는 경우를 제외하면 Git은 항상 빠르다.(물론 정말정말 큰 데이터를 커밋하는 경우는 Hg가 제일 빠르다. 그러나 내가 테스트한 크기조차도 보통은 경험할 수 없다. 그러니까 대부분의 경우는 Git이 더 빠르다.)
|
Git |
Hg |
Bzr |
Init |
0.024s |
0.059s |
0.600s |
Add |
8.535s |
0.368s |
2.381s |
Status |
0.451s |
1.946s |
14.744s |
Diff |
0.543s |
2.189s |
14.248s |
Tag |
0.056s |
1.201s |
1.892s |
Log |
0.711s |
2.650s |
9.055s |
Commit (Large) |
12.480s |
12.500s |
23.002s |
Commit (Small) |
0.086s |
0.517s |
1.139s |
Branch (Cold) |
1.161s |
94.681s |
82.249s |
Branch (Hot) |
0.070s |
12.300s |
39.411s |
The cold and hot branching numbers are the numbers for the first
and second times that I branched a repo—the second number being
a branch with a hot disk cache.
코드 브랜칭과 핫 브랜칭에 대한 결과는 내가 처음 브랜치를 만들 었을 때와 두번째 만들 었을 때를 의미한다. 핫 브랜칭은 핫 디스크 캐시를 이용한 것이다.
테스트 결과에서 'add'의 경우는 매우 느리다. 하지만 이 것은 파일 2000개가 넘는 경우에나 해당된다. 대부분의 사람들은 하루를 기준으로 일을 하는데 보통 'add'는 순식간에 이루어진다. 여기서 진행한 다른(라지 커밋은 제외한) 테스트 결과들은 우리가 날마다 실제로 하는 패턴들이다.
이 테스트를 재현하는 것은 어렵지 않다. 단순히 각 시스템마다 다음과 같은 명령어를 수행하여 Django 프로젝트의 클론을 만들면 된다.
git clone git://github.com/brosner/django.git dj-git
hg clone http://hg.dpaste.com/django/trunk dj-hg
bzr branch lp:django dj-bzr
svn checkout http://code.djangoproject.com/svn/django/trunk dj-svn