И немного о сравнении производиельность 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

One Comment

Leave a Reply

 

Get Adobe Flash playerPlugin by wpburn.com wordpress themes