Mito do Java #1: Java é Lento | Fire in the Code
HomeJavaMito do Java #1: Java é Lento
"Java é lento". Você já ouviu isso alguma vez? Pois é… aposto que sim, não é? Eu também! Aliás, eu tenho escutado isso de muita gente…
Só que eu afirmo pra você: isso é um MITO! Java não é lento! Na verdade, o Java em alguns casos pode ser mais rápido que programas escritos em C ou C++.
Acha que eu tô viajando?
Então dá uma olhada no vídeo que eu gravei falando justamente sobre isso!
Você deve estar se perguntando: "se o Java não é lento, por que as pessoas dizem que ele é lento?"
O motivo é histórico. No começo, quando o Java estava nas primeiras versões, ele realmente era lento. A JVM não era muito desenvolvida como é hoje, e dependendo do que você colocava pra executar, poderia realmente parecer que o sistema era uma carroça.
Mas isso já mudou completamente, e faz bastante tempo! A JVM hoje é tão evoluída que esse problema de performance de execução já ficou pra trás! Só que essa afirmação de que Java é lento continua ecoando por aí…
Algumas pessoas continuam repetindo essa frase como se ainda fosse verdade. Se você acha que o Java é lento, me diga: você ouviu isso de alguém? Ou v ocê fez diversos testes e comprovou por você mesmo que ele é lento? Normalmente o que acontece é a opção 1: um professor, um amigo, um frustrado com Java… Alguém falou isso pra você e você acreditou!
Mas só eu falar aqui que o Java é lento não ajuda muito… Então deixa eu te explicar porque ele é rápido!
A resposta está na figura, mais especificamente em um componente da JVM chamado JIT Compiler (Just-In-Time Compiler). Como você deve saber, a execução de uma aplicação Java é interpretada pela JVM, que executa o bytecode linha a linha (aliás, muita gente acha que o Java é lento por causa disso).
Só que a JVM é muito esperta! Quando determinado código é chamado várias vezes, o JIT Compiler faz a compilação desse código pra linguagem de máquina (a linguagem entendida pelo processador), e ele faz isso durante a execução do programa!
E quando isso acontece, a mágica entra em ação: o código compilado passa a executar mais rápido, melhorando o desempenho da aplicação.
E não é só isso… Como o JIT conhece o hardware onde a aplicação está sendo executada, ele pode compilar o código de uma forma totalmente otimizada, pra aproveitar ao máximo os recursos do hardware. Se você comparar com uma linguagem compilada como C ou C++, isso simplesmente não existe. Em C/C++ a compilação ocorre antes da execução, então o processo de compilação não tem como tirar proveito do hardware, o que faz com que ele não possa ser totalmente eficiente.
Por esse motivo, alguns tipos de aplicações Java podem executar mais rápido do que em C/C++! Parece realmente mágica, mas não é: é fato!
Aliás, no curso de Fundamentos de Java eu abordo essa questão do JIT e do HotSpot (que é o componente que detecta os códigos que precisam ser compilados pelo JIT) com mais detalhes.
E aí? Você sabia disso tudo? Se você ainda achava que Java era lento, desconfio de que todas essas coisas que eu acabei de falar são novidades pra você! Realmente espero que você tenha mudado sua opinião sobre o Java 😀
Agora faça o seguinte: compartilhe esse post com a pessoa que falou pra você que Java era lento, e vamos trabalhar juntos pra mudar a mentalidade desse povo!
E você: ficou surpreso com tudo isso que eu te contei?
Gustavo Carvalho	julho 31, 2018
Java é lento sim. Na maioria dos casos é 2 a 3 vezes mais lento. Em alguns casos o java pode ser que consiga desempenho similar, mas acho uma grande maldade usar a exceção como regra.
Um exemplo basico está nesse benchmarck
https://benchmarksgame-team.pages.debian.net/benchmarksgame/faster/java-gpp.html
E olha que o benchmarck não é esta sendo feito em cima de rotinas complexas ou de puro stress.
Projetos pequenos e simples, o java é rápido o suficiente para a "lentidão" ser imperceptível, mas quando o projeto começa a ficar maior, ai então o java mostra os seus dentes. Quando isto finalmente acontece, o projeto já tem meses e meses de desenvolvimento e fica caro demais portar para outra linguagem, ai então começa as "gambis" para fazer o produto ficar ao menos aceitável.
Este problema é facilmente perceptível no ambiente mobile, fazemos a aplicação em java e a mesma em c++, a feita em java é perceptivelmente mais lenta.
Marcos Ribeiro	julho 31, 2018
Interessante. Qual linguagem você apostaria para aplicativos mobile e para Web em geral?
Tentando escrever uma reposta mas diz que é repetido o comentário… What language do you prefer to develop mobile apps and web projects in general?
Carlos Tosin	julho 31, 2018
Fala, Gustavo! 🙂 Concordo com o benchmark! Obrigado por compartilhar sua opinião. Mas vou completar com mais algumas coisas.
Benchmarks que comparam C e Java praticamente sempre vão dar a vitória ao C. O C normalmente é mais rápido e isso é fato! E é assim porque o C é uma linguagem de baixo nível, um degrau acima do Assembly (que é praticamente linguagem de máquina). C é uma linguagem extremamente eficiente! O foco do Java não é a performance, mas um equilíbrio entre performance e "facilidade". O fato do Java ter a JVM e ser uma linguagem orientada a objetos já faz com que ela tenha desvantagens sobre o C. Só que, por outro lado, existem inúmeras outras vantagens justamente pelo Java ser assim.
No vídeo eu cito que o Java pode ser mais rápido que C em alguns casos. Isso é verdade, desde que a aplicação Java consiga explorar alguma vantagem no processador que o C não consegue (como a JVM consegue compilar o código durante a execução, ela pode tirar proveito do contexto onde o código está sendo executado, o que o C não consegue fazer). Foi isso que eu quis dizer. É um comportamento de exceção, muito específico. Agora, comparar C e Java simplesmente chega a ser covardia. Concordo com você daí, Gustavo: Java sempre vai ser mais lento que C numa comparação simples e direta.
Agora, o fato do Java ser mais lento que C não significa que ele é uma linguagem tartaruga. Longe disso. A JVM é hoje um componente extremamente eficiente e evoluiu muito nos últimos anos. Linguagens modernas que estão na boca do povo, como Kotlin, Scala, Clojure, Jython e Groovy, foram construídas pra serem executadas pela JVM. E todas são bastante eficientes.
Sobre o uso de Java em projetos pequenos e simples, eu acredito que é o inverso do que você falou. Pra projetos pequenos, existem excelentes opções, como PHP e Node.js. Mas para projetos grandes, com grandes volumes de acesso, muito processamento concorrente e que precisam ser escaláveis e distribuídos, o Java é imbatível. O Java foi feito pra isso, e ele resolve a parada com eficiência, performance e muita robustez. É por isso que muitos sites de internet banking de grandes bancos e de grandes empresas de e-commerce são feitos em Java.
E sobre o desempenho do mobile, não é justo colocar na conta do Java. O Java ME está se reinventando, nunca caiu realmente nas graças da galera, e é praticamente inútil atualmente. E o Java do Android não roda na JVM. A máquina virtual do Android é a ART (Android Runtime), que compila o código pra um código próprio e foi criada pelo Google. Então não dá pra comparar o desempenho de apps Android com C++ ou mesmo com outros sistemas Java que não sejam mobile. O Java no Android sempre vai perder.
Pelo contrario, quase na totalidade das grandes instituições sempre utilizaram sistemas em c ou c++. O motivo dos grandes bancos terem adotado o java nunca foi por causa do que ele oferece e sim pela falta de programadores c/c++, por anos e mais anos as faculdades desconstruiram o ensinamento em c/c++ e começaram adotar o java, não por que era bom e sim pq era mais fácil ensinar por que tudo já vem pronto, assim ocorriam menos reprovações, consequentemente as empresas foram quase que obrigadas a adotar o java pela falta de profissionais c/c++.
Já perdi a conta da quantidade de sistemas feitos em java que quando começaram eram as mil maravilhas e quando ficaram grandes era aquela tristeza, se perdia mais tempo deixando "usável" do que realmente fazendo.
Minha experiência com java antigamente era ruim, hoje em dia ainda é ruim e ainda falta um bom tempo para que se torne algo bom.
Sistemas em C/C++ são muito usados sim, mas não pra sistemas web. Desenvolvimento em C/C++ pra web é inviável e não é usado no mercado (talvez até exista, mas nunca ouvi falar nos meus 16 anos nesse mercado). Há muito tempo atrás existiam os CGIs, que eram componentes escritos em C e podiam ser chamados pra web, mas já morreram porque tinham uma série de limitações.
Hoje se você vai desenvolver um sistema altamente robusto pra internet, o Java é uma excelente opção. Quando eu digo que grandes empresas de e-commerce e bancos adotaram o Java, estou falando dos sistemas web dessas empresas. Acredito que essas empresas tenham diversos outros sistemas em C/C++, mas não na web.
Na minha visão existe hoje só um rival à altura do Java que é o .Net (com o ASP.NET). Mas o .Net não consegue lidar com a questão da multiplataforma com a mesma facilidade que no Java.
Gabriel	julho 31, 2018
Que lástima de postagem a sua kkkkk
Estranho, agora foram as duas =/ rsrsrs
Carlos Henrique	julho 31, 2018
Me deparei com a seguinte situação ao ultilizar o comando de repetição while com a condição true em Java no OS Windows, é utilizado aproximadamente 50% do processador.
Conforme informado pelo gerenciador de tarefas do Windows na coluna CPU.
Será que estou fazendo o comando certo?
O comando está certo, mas a quantidade de processamento usada vai depender do que está sendo feito dentro do bloco. Se forem operações que usam o processador intensamente, o nível de processamento vai subir. Só que isso não tem a ver com o Java: vai ser assim em qualquer linguagem de programação.
Davidson	julho 31, 2018
lento e seguro devagar e sempre
ATILA AUGUSTO DOS SANTOS	julho 31, 2018
A verdade é que hoje em dia com o atual poder de processamento qualquer linguagem atende.
E todo projeto mal modelado vai dar problema com o tempo.
E sobre Benchmark se não engano as linguagens(de alto nível) que lideram os principais Benchmark são c# e nodejs e as mais lentas são Ruby e python e não Java.