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!