Pular para o conteúdo principal

Comparação de Desempenho entre Subversion, Mercurial e Git

Muita coisa mudou desde que primeira versão da comparação de desempenho foi publicada em 2012-06-04. Houve várias melhorias, novas funcionalidades e correções no Subversion, Git e Mercurial. Mas o que mudou nos resultados? E na análise final?

A tabela abaixo mostra as versões usadas há quatro anos atrás e as mais atuais disponíveis no momento.

Versões Usadas na Comparação
06/2012 07/2016
Subversion 1.7.5 1.9.3
Mercurial 2.2.1 3.8.4
Git 1.7.10 2.9.1

Considerações Iniciais

A ideia é ver como as ferramentas se comportam em situações cotidianas. Para isso, basta um estudo de caso com poucas revisões e arquivos.

As operações avaliadas são:

  1. Criação/clonagem de um repositório.
  2. Adição de arquivos
  3. Consolidação
  4. Visualização do estado, histórico e das diferenças
  5. Mesclagem (Merge)
  6. Comunicação entre repositórios (pull e push)

As operações manipulam apenas alguns arquivos por vez, pois é o que acontece nas consolidações comumente realizadas por desenvolvedores.

O acesso ao repositório do Subversion é apenas local. Um repositório remoto dificultaria a replicação da experiência e adicionaria fatores não controlados como velocidade da rede à medição.

Os comandos do Mercurial estão sendo executados via chg. Isso evita o carregamento do interpretador Python a cada execução de comando. Veja este artigo para mais informações.

A execução dos comandos está automatizada em um script em bash. Os dados coletados são resumidos em uma tabela csv por um script em Python. Você pode refazer as medições usando diretamente os scripts sobre as versões instaladas em sua máquina, ou usando um container docker do Ubuntu 16.04 construído por esse Dockerfile com as versões mais recentes do Subversion, Git e Mercurial. Todos os arquivos usados nesta análise estão disponíveis no BitBucket (Mercurial) e também no Github (Git).

Resultados

Os tempos coletados estão apresentados na tabela abaixo, com a unidade de tempo em milissegundo:

Tempo de Resposta por Subcomando em Milissegundos
Subversion 1.9.3 Git 2.9.1 Mercurial 3.8.4
add 39 9 27
checkout 63 5
clone 59 46
commit 504 17 54
create 160
diff 38 8 60
fetch 31
init 4 21
log 38 3 36
merge 15 29
mkdir 569
pull 27
push 58 25
status 39 4 33
update 58
Tempo de Resposta em Milissegundos add0.03333333333checkout0.1clone0.1666666667commit0.2333333333create0.3diff0.3666666667fetch0.4333333333init0.5log0.5666666667merge0.6333333333mkdir0.7pull0.7666666667push0.8333333333status0.9update0.966666666701002003004005002729.51493848857645453.76752136752134add013.5423.7034188034188checkout4640.784710017574696393.63931623931626clone5445.529876977152895363.5752136752137commit013.5333.51111111111106create6049.08875219683655303.4470085470085diff013.5273.382905982906fetch2125.956063268892798243.3188034188034init3634.85325131810194213.25470085470084log2930.701230228471005183.1905982905983merge013.5153.1264957264957mkdir2729.51493848857645123.06239316239319pull2528.328646748681992.9982905982906push3333.07381370826010462.934188034188054status013.532.870085470085456update918.838312829525485444.9487179487179add516.46572934973638414.88461538461536checkout5948.49560632688927384.8205128205128clone1723.58347978910369354.7564102564103commit013.5324.6923076923076create818.24516695957821294.6282051282051diff3131.887521968365554264.56410256410254fetch415.872583479789103234.5init315.279437609841828204.43589743589743log1522.39718804920914174.3717948717949merge013.5144.3076923076923mkdir013.5114.24358974358978pull5847.90246045694284.17948717948718push415.87258347978910354.115384615384635status013.524.051282051282033update3936.63268892794376436.1299145299146add6350.86818980667838406.06581196581203checkout013.5376.0017094017094clone504312.4455184534271345.93760683760684commit160108.40333919156414315.8735042735043create3836.03954305799648285.80940170940175diff013.5255.74529914529913fetch013.5225.6811965811966init3836.03954305799648195.61709401709402log013.5165.55299145299148merge569351.0135.48888888888888mkdir013.5105.42478632478635pull013.575.36068376068376push3936.6326889279437645.296581196581215status5847.90246045694215.232478632478617updateTempo de Resposta em MilissegundosSubversionGitMercurial

Análise

Segundo JakobNielsen1993, há três limites de tempo de resposta que percebemos:

  • Abaixo de 100ms. Percebido como resposta instantânea.
  • Abaixo de 1s. Nota-se o atraso, mas o usuário mantém o fluxo de pensamento.
  • Até 10s. Limite que o usuário permanece focado na operação. Depois disso, os usuários tendem a executar outras atividades enquanto esperam a operação terminar.

Os repositórios do estudo de caso são muito pequenos. O Subversion teve algumas operações acima de 100ms, mas abaixo de 1s. O Mercurial e o Git executaram seus comandos abaixo de 100ms. Nenhuma das três ferramentas apresentou um tempo de resposta demorado o suficiente para que o desenvolvedor tenha motivo para se distrair com outras coisas.

Mesmo o Subversion se saiu bem nos testes, mas foi mais lento que o Git e o Mercurial. Certamente os tempos de algumas operações seriam piores caso o repositório fosse remoto e houvesse requisições concorrentes de processamento. Ainda assim, provavelmente os tempos continuariam satisfatórios em uma situação normal.

Conforme esperado, o Git continua sendo extremamente rápido em repositórios pequenos. O destaque ficou com o Mercurial que foi muito rápido com o chg e até mais rápido que o Git em operações de clonagem, pull/fetch e push.

JakobNielsen1993 https://www.nngroup.com/articles/response-times-3-important-limits/

Comentários

Comments powered by Disqus