Benchmark Caseiro Java vs C++ para Web

Caros, recentemente vi um vídeo no youtube sobre um linguagens do futuro onde um cara falava que o C++ seria ainda utilizado no futuro mas só em aplicações parrudas.

Pois bem, primeiro que eu nem sabia que dava pra programar em C++ para web, então fiquei curioso e resolvi pesquisar e vi que era possível rodar em CGI pelo apache de forma bem simples.

Então fiz um benchmarkzinho para comparar o java com o c++, segue os dados do teste:

  • Cenário

Buscar 5.000 registros no banco de dados e retorna-los como JSON

  • Banco de Dados

Mongo DB

  • Java

Em Java usei a versão 8 e spring 4 com spring-data-rest rodando em tomcat embutido no spring

  • C++

Usei apenas o driver do mongodb para conectar, dar um find e exibir os registros rodando em um apache padrão 2.4

  • Ambiente de execução

MAC OSX El Capitan - 8GB RAM - SSD

  • Execução do teste em C++ em um request simples:

time curl -XGET “http://localhost/cgi-bin/customers” > /dev/null 2>&1 &

real 0m0.221s
user 0m0.007s
sys 0m0.008s

Vocês podem ver que a requisição simples levou 0.221 segundos para ser ser executada no C++ com apache

  • Execução do teste em Java em um request simples:

time curl -XGET “http://localhost:8090/customers” > /dev/null 2>&1 &

real 0m0.077s
user 0m0.008s
sys 0m0.013s

Como vocês podem ver o Java levou menos da metade do tempo pra executar o mesmo cenário.

  • Execução do teste em C++ com 100 requests multiplos:

time curl -XGET “http://localhost/cgi-bin/customers” > /dev/null 2>&1 & (Executado 100x simultaneamente)

Das 100 execuções a que levou mais tempo para ser executada foi:

real 0m12.527s
user 0m0.010s
sys 0m0.010s

12,5 segundos para executar a requisição que levou mais tempo para ser finalizada dentre as 100 execuções.

  • Execução do teste em Java com 100 requests multiplos:

time curl -XGET “http://localhost:8090/customers” > /dev/null 2>&1 & (Executado 100x simultaneamente)

Das 100 requisições a que levou mais tempo para ser executada foi:

real 0m8.220s
user 0m0.007s
sys 0m0.012s

Como vocês podem ver o Java foi 35% mais rápido que o C++ na requisição que levou mais tempo para ser executada, porém a velocidade diminuiu em relação ao request simples, talvez com mais requisições o C++ consiga tirar a diferença!

  • Conclusão

Quando pensei em fazer este teste estava achando que o C++ seria mais rápido, porem fui surpreendido com o Java sendo mais rápido que o C++, porém o C++ se mostrou mais robusto pois nas requisições multiplas se mostrou mais rápido que o JAVA, pois a diferença de tempo entre a requisição multipla e a simples foi menor, mesmo o JAVA sendo mais rápido, o C++ tirou a diferença. Talvez em uma aplicação muito complexa, o C++ possa mostrar mais robustez e ser mais rapido que o Java. Tentei rodar 1.000 requisições simultâneas, mas meu micro não rodou.

Detalhe que no java eu utilizei frameworks, no caso o spring, e uma estrutura MVC, que na teoria deveria deixar o codigo ligeiramente mais lento comparado ao C++ que usei puro e apenas fiz um select e dei output dos dados sem utilizar estrutura MVC.

Também não fiz nenhuma espécie de tunning no apache para o C++ como por exemplo utilizar fastcgi ao invés de CGI padrão, o que poderia ter melhorado o desempenho.

Também não sou ninja em C++, talvez pudesse ter escrito um código mais performatico, porém acho dificil pois o codigo em C++ é bem simples, não passa de 10 linhas.

Então o que fica de lição até o momento é que o Java é mais rápido que o C++, porém o C++ pode ser robusto e até mais rápido em uma aplicação mais complexa e com muito mais requisições, talvez em um google ou facebook por exemplo ele seja mais útil, mas para termos certeza precisaríamos de um ambiente mais robusto pra testar e um teste mais bem elaborado. Fora que a mão de obra do C++ deve ser mais cara que o Java. Logo teremos mais vagas de Java do que de C++.

Abs!