ti-enxame.com

Por que as pessoas ainda dizem Java é lento?

Por um longo tempo em SO e em outros lugares Java tem a reputação de ser lento. De piadas a muitos comentários em perguntas e respostas, as pessoas ainda acreditam que Java é lento com base apenas na experiência com ela nos anos 90.

Este é o meu problema: temos refutado (a maioria) das razões pelas quais as pessoas acreditam que Java é lento. Fora de pequenas coisas, Java é bem rápido.

Então, por que as pessoas ainda se recusam a acreditar que Java é rápido agora? Faz parte da mentalidade deles que algo que não seja C/C++ seja lento? É porque as pessoas não verificam com o tempo? É porque as pessoas são apenas tendenciosas?

61
TheLQ

São as aplicações. Como você observa, nós temos provamos, repetidamente, que em cenários planejados Java pode atender ou mesmo bater o desempenho de as chamadas linguagens de "desempenho", como C, C++, LISP, VB6 ou JavaScript, e quando apresentadas com essa evidência, os oponentes mais sensatos e de mente aberta ficam com a cabeça envergonhados e prometem nunca mais espalhar essa calúnia.

... mas, então, eles iniciam o Eclipse, o NetBeans ou o Guiffy, ou habilitam o suporte Java em seu navegador ou tentam executar um aplicativo em seu telefone favorito. E esperam para que ele se torne responsivo ...

...e espere...

...e espere...



...e espere...







...e espere...











...e...




... o que prometi nunca mais fazer? Desculpe, deve ter cochilado ...

131
Shog9

Esta pergunta opera em premissas falsas: onde conta, Java ainda é lento. Onde conta são algoritmos pesados ​​em computação em grandes conjuntos de dados. Concedido, esses podem ser otimizados, às vezes para estarem em pé de igualdade com o código C/C++, mas apenas ao custo da modularidade e da genéricaidade. O código C++ eficiente pode ser projetado para ser genérico e utilizável como uma biblioteca de uso geral. Java não pode. Basta olhar para o altamente otimizado Array.sort, que usa implementações diferentes para todos os tipos fundamentais e cuja variante de objeto ainda é muito mais lenta que o genérico do C++ sort porque esses objetos precisam despachar comparações de igualdade dinamicamente.

É verdade que as otimizações pontuais realizadas pelo mecanismo do HotSpot podem realmente prever o destino dessas chamadas virtuais e tentar inlining. Mas isso é ainda mais lento que a chamada diretamente embutida que é despachada dentro do método C++ 'sort.

Um ex-colega meu fez comparações comparativas de um problema em grandes conjuntos de dados ( q - contagem de grama usando formas dinâmicas) com uma implementação C++ modelada e um orientado a objetos Java. O código Java foi uma ordem de magnitude mais lenta que o código C++.

Claro que isso está comparando maçãs com laranjas. Mas o ponto é que a implementação Java foi a melhor implementação possível (em termos de desempenho, dado o grau de modularidade necessário para uma biblioteca)), e a implementação do C++ também.

Infelizmente, os dados de referência não estão disponíveis gratuitamente, mas outros encontraram números semelhantes ao comparar a sobrecarga da abstração de tempo de execução. Por exemplo, Scott Meyers escreve em STL eficaz sobre a sobrecarga da função genérica qsort de C:

A classificação de C++ praticamente sempre embaraça o qsort de C quando se trata de velocidade. […] Em tempo de execução, a classificação faz chamadas inline para sua função de comparação ... enquanto o qsort chama sua função de comparação através de um ponteiro. […] Nos meus testes com um vetor de um milhão de vezes, [classificar] foi até 670% mais rápido…

48
Konrad Rudolph

Porque é lento ... em algumas aplicações. Os aplicativos de desktop precisam responder desde o início e a sobrecarga de inicialização conta como lenta.

Por outro lado, se você executa um servidor, não importa se há algum aquecimento (análise e compilação do JIT) - você faz isso uma vez na lua azul; portanto, na maioria das vezes, não pode ser considerado totalmente lento.

28
Maciej Piechotka

Eu diria que é porque quando as pessoas o encontraram pela primeira vez, foi lento. Com base nisso, eles formaram uma impressão disso. É improvável que essa impressão mude se eles não a usarem e não a usarem por causa dessa impressão - é um ciclo vicioso.

Devo admitir que tive a impressão de que Java era lento, e sim, isso era da minha exposição anterior a ele. Agora mudei para idiomas diferentes e tive uma exposição extremamente limitada a Java desde então. Consequentemente, minha opinião não mudou muito.

21
Damovisa

Porque leva uma geração para mudar as percepções das pessoas sobre um produto

Não tem nada a ver com a rapidez com que Java se torna. Na mente das pessoas Java é um identificador de const associado à palavra "lento".) ou a Oracle pode fazer sobre isso.

Fique feliz por o Oracle não ter destruído a cultura de programação Java (ainda)) fazendo algo precipitado ou estúpido . Como cobrar custos excessivos de licenciamento para usá-lo. pessoas com base em patentes de software de propriedade da Sun. :: sigh ::

Eu odeio ser o pessimista aqui, mas, a menos que a Oracle e o Google resolvam a luta Java nos termos de Nice, ou o Google seja forçado a comprar Java e faça com que seja uma plataforma de código aberto 'adequada', Java está no caminho de ser o garoto no playground que tem piolhos. Ou seja, ninguém vai querer tocá-lo com um poste de 20 pés.

Nota: Só para deixar claro, quando digo geração, estou falando em termos de pessoas e não de computador. Ou seja, até que as pessoas que sustentam essa percepção morrem de velhice ou sejam substituídas por uma geração mais jovem, a percepção será verdadeira. Pense em termos de 5 décadas e não 5 anos.

16
Evan Plaice

Uma razão é que as pessoas confiam no que os outros dizem e não no que veem.

De acordo com o que me disseram quando comecei a programar, Java é "mais lento" que C++, e a razão pela qual Java poderia ser usado é porque é "conveniente e é mais fácil ". Acredita-se muito comum que Java traz segurança e conveniência, ao custo de desempenho. Mesmo quando o C # posterior é inventado, as pessoas acreditam que é mais rápido que Java porque é "nativo".

Mas a verdade que as pessoas vêem sem perceber é que, Eclipse, o IDE que é construído com Java, é absolutamente o MAIS RÁPIDO IDE na classe. usado quase todos os IDEs de fluxo principal, os de MS e GNU, Borland ..., o Eclipse é o rei absoluto dos IDEs, em grande parte por ser rápido.

Outro motivo é o seu longo tempo de inicialização.

Java não é adequado para o desenvolvimento de um aplicativo minúsculo que fica na bandeja do sistema, consome um pouco de memória, abre uma caixa de diálogo lembrando que você deve fazer uma pausa; ou um bloco de notas usado para abrir um arquivo de texto, leia-o e feche-o. Ele deve ser usado em algo GRANDE, como um servidor Web sempre disponível, faça uso otimizado do seu recurso de computação e responda a milhões de solicitações a cada hora. Ou um IDE como o Eclipse, que gerencia milhares de arquivos da área de trabalho. Você não o conhece) Java é rápido até que seja executado por pelo menos várias horas, Acredito.

11
tactoth

@bigown "Por que as pessoas ainda dizem que Java está lento?"

Porque eles são burros. Porque eles não têm experiência de trabalho, mas pensam que são a encarnação viva de Dikjstra ou a segunda vinda de Linus Torvald, oh, eu não sei. As razões para dizer uma coisa tão retardada são muitas, mas geralmente a estupidez, o fanboyismo subjetivo irracional e a atenção emocional parecem estar por trás deles.

Vamos desativar isso para que você possa ver a verdade do que acabei de dizer acima:

Primeiro, o que é lento, em que contexto, para que, em que condições, com que finalidade de engenharia/científico/negócios (por dizer é ruim não é um deles.) Qualquer pessoa que diga " X é lento "para qualquer tecnologia X, ou simplesmente" X é Y ", onde Y é algum tipo de afirmação negativa, sem responder a nenhuma das perguntas acima, deve ser descartada como uma tolice. Declarações como essa não têm lugar na engenharia. Na política e nas salas de bate-papo juvenil, talvez, mas não na engenharia.

Segundo, a maioria desses tolos mal orientados grita que Java é lento porque o ZOMG, seu Eclipse leva uma eternidade para disparar (gee, carregue a coisa com todos os plug-ins e adivinhe o que acontece.) A maioria desses tolos não ' nem sei como ajustar a jvm para que o Eclipse opere rapidamente (ou para qualquer aplicativo Java nesse caso). Ou seja, eles não têm idéia sobre o ajuste de desempenho, que é uma realidade não apenas para Java, mas para qualquer sistema não trivial, seja hardware ou software. Então, ali mesmo, eles se desarmam por qualquer validade técnica ao fazer tais declarações irracionais.

Terceiro, vamos considerar para que serve a maior parte do Java desenvolvimento: back-end OLTP em primeiro lugar; sistemas de monitoramento em segundo lugar. Qualquer um dos tipos de sistema deve ser executado em clusters e ser executado ininterruptamente por semanas, se não meses. Realmente importa, então, que seu pequeno aplicativo Eclipse ou brinquedo demore um ou dois minutos para carregar quando o objetivo dos aplicativos REAL Java é executar por longos períodos de tempo? Contexto, pessoas, contexto.

Por fim, a espinha dorsal de OLTP no Google e no Ebay é executada em Java. Eu consideraria isso uma prova por contradição de que Java não é lento (pelo menos para condições que importam, não para pequenas experiências com brinquedos, benchmarks e evidências anedóticas não verificáveis ​​feitas especificamente com o objetivo de dizer "o X é lento, é uma merda. "

Há engenharia e há fanboyismo. Adivinha a que afirmações de categoria como essas pertencem?

8
luis.espinal

Porque é, podemos fechar esse tópico de uma vez por todas?

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf [role para baixo para tabelas, Java é 3.7 -12,6 vezes mais lento que C++, pesquisa realizada por funcionários do Google]

P.S .: Se não estiver, me dê pelo menos um aplicativo rápido Java para começar, nunca o vi antes).

8
Coder

Lento comparado com o que? Estou pensando em mudar de Ruby comum para JRuby (Ruby baseado em Java) porque ouvi dizer que é mais rápido.

6
Andrew Grimm

Opiniões são opiniões, e fatos são fatos.

Aqui está um fato do Google Code Jam, que desafia os programadores a resolver problemas difíceis de computação em um curto período de tempo, o que significa que o desempenho do idioma usado desempenha um papel importante:

Durante as edições anteriores (2009, 2010, 2011), cerca de 75% dos programadores que chegaram às rodadas finais estavam usando C++, em vez de cerca de 15% usando Java.

Fonte -> http://www.go-hero.net/jam/

6
Daniel Scocco

TMHO, isso ocorre devido ao tempo necessário para iniciar o VM no navegador. Se um aplicativo for iniciado lentamente, as pessoas só se lembrarão disso. Porque, o longo tempo de início é realmente irritante. Realmente. Um do meu colega de trabalho me disse que ele não usa o Firefox porque é muito lento. (?!?). Mas, sim, ok, no Windows, o Firefox leva uma quantidade enorme de tempo para aparecer. Como esse aplicativo é lento, ele decidiu a velocidade geral.

6
Pierre Watelet

Por volta de 1997, usei o HP Vectra VE (200 MHz) e o Windows 95. A maioria dos aplicativos rodou muito rápido nisso, mas tentei alguns aplicativos escritos em Java (IDEs, se bem me lembro). Eles eram muito lentos, pelo menos as partes da GUI deles. Eles demoraram muito tempo para iniciar e os elementos da GUI (por exemplo, menus) não foram muito responsivos - houve atrasos no feedback visual. Além disso, como os aplicativos GUI Java tinham (tem) uma aparência bastante distinta, aprendi a associar essa aparência (e Java) a um desempenho ruim.

4
Andreas Rejbrand

Depende do que você quer dizer com ser lento.

Primeiro de tudo, Java já fez muitos progressos recentemente e é muito rápido na maioria dos casos. Mas:

  • Java é lento na inicialização, porque você precisa carregar a JVM antes de fazer qualquer coisa.
  • Alguns recursos de segurança podem prejudicar o desempenho em alguns casos. A verificação limitada com acesso aleatório é um exemplo.
  • Faça algo realmente rápido em Java exige que você trabalhe com a JVM (para tirar proveito da linha de cache, por exemplo)).
  • A falta de metaprogramação implica uma penalidade no tempo de execução com cada abstração, portanto o desempenho chega ao custo do design em muitos casos.
  • O Java dificilmente pode garantir restrições em tempo real - por design - e isso pode ser considerado como "lento" por algumas pessoas.

A propósito, Java é, em alguns casos, mais rápido que o Vanilla C/C++. Mas essas linguagens oferecem as ferramentas para ajustá-las.

Java é uma linguagem de programação voltada para a produtividade. Agora, é rápido o suficiente para a maioria dos aplicativos, mas não é suficiente para alguns outros.

Em geral, a lentidão do Java é um argumento usado demais porque é irrelevante na maioria dos casos.

4
deadalnix

Simples, canônico Java tende a ser parecido ou mais rápido que o código C/C++/D simples e canônico. O código canônico simples tende a executar muitas alocações de memória desnecessariamente, não sendo particularmente sintonizado em qualquer arquitetura de CPU, sem muitas otimizações de baixo nível, etc. O HotSpot GC do Java é incrível, e as otimizações VM tendem a ser melhores do que um compilador estático poderia fazer.

Por outro lado, se você realmente precisa de desempenho e está disposto a ajustar manualmente as coisas para obtê-lo, o C/C++/D oferece muito mais oportunidades para isso. Você não pode usar o assembler embutido em Java. Você não pode usar truques de punção do tipo sujo para tratar números de ponto flutuante como matrizes de bits. Você não pode usar esquemas de gerenciamento de memória personalizados que podem ser mais rápidos que o GC para seu caso de uso específico. Você não pode alocar quase tanto na pilha em Java quanto em C/C++/D. Em Java a única maneira de obter algo equivalente a funções de ordem superior são com interfaces e ligação em tempo de execução.Em D e (acho que me corrija se estiver errado) C++, você pode passar funções para modelos, permitindo que a ligação aconteça no tempo de compilação sem perda de flexibilidade.

2
dsimcha

Outro ponto para a "lentidão" de Java é o tempo de execução de 64 bits.

Ouvi algumas pessoas reclamarem que Java é muito lento para elas em computadores de 64 bits. Como se vê, 64 bits Java runtime usa JVM do servidor que compila todo o programa antes de iniciar.

AQUI é a explicação por que 64bit VM começa mais devagar.

Por exemplo no Windows:

C:\> Java -version  
Java version "1.6.0_21"  
Java(TM) SE Runtime Environment (build 1.6.0_21-b06)  
Java HotSpot(TM) 64-Bit Server VM (build 17.0-b16, mixed mode)  
1
AndrejaKo

Para jogar uma moeda sem valor, acho que Java geralmente têm longos tempos de inicialização e resposta, onde me parece que Python ou Ruby teria feito melhor.

Eu uso o Eclipse na maior parte da minha programação e devo dizer que Java é tão rápido quanto qualquer outra coisa, se não mais rápido, é executado localmente e "independente").

0
thomas

O desempenho de Java é muito subjetivo, no entanto, a percepção do porquê Java é lenta é em grande parte por razões que outros observaram: a maioria das pessoas percebe que algo é colorido por sua experiência anterior com ele e Java nem sempre foi uma linguagem bem otimizada). Da mesma forma, o Vanilla Eclipse não é exatamente um rápido IDE trabalhar com e empalidecer em termos de capacidade de resposta quando comparado a um IDE como o Visual Studio.

Porém, fora dos problemas de interface do usuário que Java tem na inicialização, é rápido o suficiente para a maioria dos aplicativos. Se você pesquisar, poderá encontrar artigos que o comparam com outros idiomas e a maioria dos resultados apresentados o coloca no intervalo em que somente será um problema quando você estiver lidando com os principais conjuntos de dados.

No campo da bioinformática, ele é usado um pouco, pois é bem suportado e já existe uma base de instalação, uma das vantagens que Java possui é que você pode fazer um desenvolvimento bastante rápido com que você não pode fazer com C. Se você olhar para as linguagens usadas para bioinformática (eu pessoalmente uso R, Python e Java regularmente)), você notará que nenhuma delas é exatamente a mais rápido e não é incomum que os conjuntos de dados em bioinformática cheguem aos 100 gigabytes de informações.No final do dia, o tempo humano ainda é mais valioso e, embora as diferenças de velocidade sejam perceptíveis, o tamanho dos conjuntos de dados tendem a ser grandes o suficiente para que eles pernoitem de qualquer maneira.

Se fosse mais fácil escrever uma interface de usuário rápida em Java, é bem provável que a percepção de velocidade caísse do radar, pois a maioria das pessoas não pressiona linguagens o suficiente para que a velocidade seja realmente um problema diário) base.

0
rjzii