И немного о сравнении производиельность SVN с GIT ( да я знаю – ‘чертовы гики, пректите мигрировать с svn на git и обратно – пишите код и не занимайтесь ерундой!‘ (c) Никита Филиппов ). Даже скорее о сравнении производительности svn и git в случае если пользоваться git-ом точно так же как svn – это гораздо лучше отражает use-case миграции с одной системы контроля версий на другую, потому что большинство людей после миграции будет пользоваться git-ом в режиме максимальной совместимости с svn, хотя бы просто потому что за много лет они уже привыкли к svn-парадигме работы с репозиторием.
Итак что мы имеем – svn и git проинсталлированные на одном и том же сервере, изначально оба репозитория пустые. Я применил одну и ту же последовательность действий с одними и теми же данными и замерил время выполнения этих операций – мои тесты в основном касались ряда типичных операции с системами контроля версий – добавить данные, сделать checkout, поменять данные, обновиться из репозитория и тп. Соответственно, я замерял время требуемое как для комитов изменений, так и для получения обновления от этих изменений. Конфигурации svn и git использовались стандартные, я ничего не правил в конфигах – все настройки должны быть используемыми по умолчанию. Всеобъемлющего теста конечно у меня не получилось – я не проверял удаление, создание бранчей, merge и многие другие вещи – потом будет чем дополнить этот тест.
Сразу оглашу результаты теста – git быстрее чем svn примерно в 2-3 раза, единственная проблема которая может возникнуть с git – это работа с большими ( > 300 мб ) файлами, при этом возможна даже ситуация когда git завершится с ошибкой при попытке закомитить файл большого объема ( в моем случае падение производительности началось от 100 мб и окончательно git свалился с ошибкой на комите файла 1200 мб ). Эта довольно неприятная ( хотя если честно очень мало кому приходится комитить файлы размером больше 300 мб ) особенность git-а вроде как исправлена в проекте git-bigfiles, но я подробно его еще не смотрел.
|
svn |
git |
svn/git |
| Test 1 : adding boost 1_43 |
add ( 1 sec )+ commit ( 600 sec ) = 601 sec |
add ( 3 sec ) + commit ( 86 sec ) + push ( 612 sec ) = 701 sec |
0.85 |
| Test 2: checkout repository after Test 1 |
svn co = 109 sec |
clone = 18 sec |
6.05 |
| Test 3 : поменял 346 файлов – добавил в начало одну строку(комментарий) |
svn commit = 5 sec |
commit(2 sec ) + push ( 2 sec ) =4 sec |
~1 |
| Test 4: update after this Test 3 |
svn update = 15 sec |
git pull ( 7 sec) |
~2 |
| Test 5: поменял аналогичным образом ( добавил первую строку ) в 5363 файлов |
svn commit = 103 sec |
commit ( 6 sec ) + push ( 18 sec ) = 24 sec |
4.29 |
| Test 6: update after Test 5 |
svn update = 28 sec |
git pull = 12 sec |
2.3 |
| Test 7: добавил репозиторий из “реальной жизни” ( 2.6 гб разносортных данных, большей частью с++ код ) |
svn add(21) + svn commit(1h 2m 25s) = 3 766 sec |
add (38 ) + commit ( 1m23 ) + push ( 18m28 ) = 1 m 51 + 18m 28sec= 20 m 19 sec = 20 m 19 sec = 1 219 sec |
3.1 |
| Test 8: update after Test 7 |
svn update ( 11m 58 sec ) = 718 sec |
git pill = 5m 27 sec = 327 sec |
~2.2 |
| Test 9: имитация рефакторинга – добавил принудительное использование namespace ( std:: ) |
svn commit ( 1m 28 sec ) = 98 sec |
commit (5 sec ) + push ( 3 sec) = 8 sec |
12.25 |
| Test 10 : update after Test 9 |
svn up = 22 sec |
pull ( 9sec) |
2.4 |
| Test 11: full checkout project |
svn co 12m 45sec = 765 sec |
pull ( 4 min 3 sec ) = 243 sec |
3.14 |
| Test 12: тест на файлы большого размера – лог apache ( 50 mb ) |
svn add(3) + commit (1m 27s ) = 1m 30 sec = 90 sec |
add (3) + commit(6) + push (1m 18 sec) = 1m 17 sec = 77 sec |
1.16 |
| Test 13 update after test 12 |
up = 26 sec |
pull = 17 sec |
1.52 |
| Test 14 : тест на большие файлы : все c++ исходники одного проекта одним файлом ( 70 mb ) |
add(3) + commit(1m 15 sec) = 1m 18 sec = 78 sec |
add (2) + commit (2) + push ( 56 sec ) = 1 m = 60 sec |
1.3 |
| Test 15 : update after Test 14 |
up = 28 sec |
pull = 14 sec |
~2 |
| Test 16: тест больших файлов – 100 МБ xml |
add(3) + commit (8m 37 sec)= 8m 40 sec = 520 sec |
add (9 sec) + commit (1) + push ( 24m 34 sec) = 24 m 44 sec = 1484 |
0.35 |
| Test 17 : update after Test 16 |
up = 52 sec |
pull = 47 sec |
1.10 |
| Test 18 : тест больших файлов – 300 MB xml |
add ( 1 ) + commit( 9 m 26 sec )= 9m 27 sec = 567 sec |
add (3) + commit(8) +push (17m 12 sec) = 17 m 33 sec = 1053 sec |
0.53 |
| Test 19: update after test 18 |
1m 39 sec |
pull= 1m 29 sec |
1.1 |
| Test 20 тест больших файлов : 1200 MB xml |
1h 24m 34s |
failed |
? |
| Test 21 : update after Test 20 |
5m 47 sec |
failed |
? |
| |
|
|
~2.6 |
Итак – мы видим что в среднем git в 2.6 раза быстрее чем svn. Мои тесты не прендуют на точность и, как я уже заметил, далеко не все use-case были проверены, но тем не менее определённые выводы сделать можно. Мы видим что git быстрее больше чем в раза почти всегда, не совсем всегда – это работа с большими файлами – там скорость работы git уже равна либо даже сильно хуже чем у svn, и более того в моем случае git push после добавления большого ( 1200 Мб ) файла даже завершился с ошибкой – ‘fatal: Out of memory, malloc failed‘
Test1 boost 1_43 C++ library : 29135 файлов ( всего 31609 объектов включая папки ), общий размер – 286 Mб
Test 3
Добавил первую строку-комментарий к файлам отобранным по маске:
find ./ -name "*a???.cpp" -exec sed -i 1i"//test comment `date` : {}" {} \;
Test 5
Добавил первую строку-комментарий к файлам отобранным по маске “*.cpp”
find ./ -name "*.cpp" -exec sed -i 1i"//big test comment2 `date` : {}" {} \;
Test 7:
Добавил реальный проект из реальной жизни : огромное количество исходников ( cpp, perl, erlang, makefiles, bash ), документация в MS word формате, картинки, pdf’s, собранные бинарники ( моветон, но таков реальный проект ), файлы ресурсов и тп, суммарно – 4605 files, общий размер около 2.6Гб
Test 9:
Небольшая имитация рефакторинга – добавил использование указания namespace std:: для все cout и cerr. Кстати не уверен что это реально безобидное изменение 
find ./ -name "*.h" -exec sed -i "s/ cerr/std::cerr/g" {} \;
find ./ -name "*.cpp" -exec sed -i "s/ cerr/std::cerr/g" {} \;
find ./ -name "*.cpp" -exec sed -i "s/ cout/std::coutr/g" {} \;
Test 11: checkout всего репозитория целиком
Test 12: тест больших файлов : добавил в репозиторий текстовый файл размером 50 Мб ( лог apache ).
Test 14: тест больших файлов : добавил в репозиторий текстовый файл размером 72 Мб ( сконкантерировал все с++ исходники одного подпроекта в один файл ).
Test 16: тест больших файлов : добавил в репозиторий текстовый файл ( xml ) размером 100 Мб
Test 18: тест больших файлов : добавил в репозиторий текстовый файл ( xml ) размером 300 Мб
Test 20: тест больших файлов : добавил в репозиторий текстовый файл ( xml ) размером 1200 Мб
git push failed с сообщением о memory leak : “fatal: Out of memory, malloc failed”
См также Version control systems : git, svn, cvs, mercury links