A linguagem Scala é a linguagem que tem melhor performance na JVM?

36 respostas
J

Encontrei essa link

http://www.readwriteweb.com/hack/2011/06/cpp-go-java-scala-performance-benchmark.php

falando da análise de um engenheiro do google fez sobre a performance de 4 linguagens.

https://days2011.scala-lang.org/sites/days2011/files/ws3-1-Hundt.pdf

Mas o que achei interessante é que a linguagem scala teve uma performance superior à própria linguagem java, quase
chegando à performance do C++ com código super tunado.

Mas será que essa análise pode ser considerada válida ?

36 Respostas

A

Assunto tão polêmico quanto a existência ou não-existência de deus. No final, qual é a grande vantagem em 99,9% dos casos?

M

Scala pode ser mais rápido que Java. Qual a surpresa?

M

O título é completamente inadequado também.

O benchmark foi entre 4 linguagens apenas, sendo que duas delas não rodam na JVM.

J

Fiz essa pergunta porque ainda estou começando a programar em Scala,
e queria saber se essa realidade de performance é real, se já existem outras
análises de desempenho mais confiáveis. Mas pelo jeito o guj não
é o melhor lugar para esse tipo de pergunta.

M

É aquela velha história, em algumas situações ela vai ser mais rápida, em outras talvez não. Na média, vai de cada caso.

Bem, bem grosseiramente, seria comparar uma linguagem que é rápida no comando while e lenta no if e na atribuição comparada ao java. No geral é mais rápida? Depende se o programa tem muito loop, entendeu?

Pra não dizer que só divaguei e não respondi, nunca testei o mesmo programa nas duas, mas quando eu comparo ‘no olho’ dois sistemas simples, não consegui perceber muita diferença e nao sou satisfeito com a performance de nenhum dos dois. hehehe

V

johnny quest:
Mas o que achei interessante é que a linguagem scala teve uma performance superior à própria linguagem java, quase
chegando à performance do C++ com código super tunado.

Como assim quase chegando a performance do C++? O relatório diz que o melhor caso foi 2.5x mais lento e consumiu 80% mais memória.

De qualquer forma, a velocidade de execução de comandos dificilmente representa um gargalo de performance.
Normalmente seu problema estará em entrada saída, no banco de dados, arquivos, rede, etc…

Esses benchmarks só são válidos em sistemas de tempo real e sistemas estritamente matemáticos, super CPU-Bound.

J

ViniGodoy:
johnny quest:
Mas o que achei interessante é que a linguagem scala teve uma performance superior à própria linguagem java, quase
chegando à performance do C++ com código super tunado.

Como assim quase chegando a performance do C++? O relatório diz que o melhor caso foi 2.5x mais lento e consumiu 80% mais memória.

De qualquer forma, a velocidade de execução de comandos dificilmente representa um gargalo de performance.
Normalmente seu problema estará em entrada saída, no banco de dados, arquivos, rede, etc…

Esses benchmarks só são válidos em sistemas de tempo real e sistemas estritamente matemáticos, super CPU-Bound.

Nego tinha que parar de fazer benchmark com linguagem e fazer com POGramador. Porque linguagem por linguagem, nenhuma presta mão mão de um POGramador.

J

Como assim quase chegando a performance do C++? O relatório diz que o melhor caso foi 2.5x mais lento e consumiu 80% mais memória.

Vinigodoy, falei quase porque foi a linguagem mais próxima a chegar ao nível de performance de C++ super otimizado.

However, it also required the most extensive
tuning efforts, many of which were done at a level of sophistication that would not be available to the average programmer.

É louvável uma linguagem como scala gerando bytecode rodar à apenas 2.5x mais lento que C++ super otimizado.

S

Só consigo imaginar uma área onde essa performance é relevante: Mercado Financeiro.

Todas as outras áreas vc pode e deve escalar horizontalmente. Eu realmente não sei o prazer que as pessoas tem em fazer programas super-rápidos, quando a diferenca depois de toda a otmizacão será de alguns microsegundos. Mesmo que seja millisegundos mais rápido, por que vc precisa disso?

EDIT: Talvez jogos, e isso on Vinigodoy pode falar.

V

Aplicações de tempo real (games, firmware) ou com enorme volume de processamento (análise financeira, meteorológica, redes neurais, produção de vídeo) se beneficiam muito de linguagens desse tipo. E 2.5x e 80% a mais de memória está MUITO longe de ser pouco numa aplicação desse tipo. Algumas dessas processam por semanas ou um atraso de poucos ms pode ser catastrófico.

Quanto ao 0.1%. Pense no quão relevante ele é quando você estiver num avião e o 0.1% for o firmware do seu transponder. Ou para as pessoas que são avisadas de furacões.

S

ViniGodoy:
Aplicações de tempo real (games, firmware) ou com enorme volume de processamento (análise financeira, meteorológica, redes neurais, produção de vídeo) se beneficiam muito de linguagens desse tipo. E 2.5x e 80% a mais de memória está MUITO longe de ser pouco numa aplicação desse tipo. Algumas dessas processam por semanas ou um atraso de poucos ms pode ser catastrófico.

Quanto ao 0.1%. Pense no quão relevante ele é quando você estiver num avião e o 0.1% for o firmware do seu transponder. Ou para as pessoas que são avisadas de furacões.

Duvido que quem está preocupado trabalha com isso. E como falei vc pode escalar horizontalmente e processar as coisas em paralelo.

Repetindo suas palavras:

A

Uma dúvida: essa diferença do C++ se deve a compilação em código nativo ou alguma qualidade extra do compilador?

Outras linguagens que compilam para código nativo (lisp, haskell, erlang), alcançam a mesma performance?

V

Acho que além do compilador é o fato dele dar muito controle. Tudo isso tem um preço claro. É muito dificil escrever codigo c++ otimizado. Mas no caso do tempo real o c++ e o c tem outra vantagem: você pode prever o tempo de processamento no meio do código, sem chance do gc rodar no meio. Se precisar mesmo, e facil até dar instrucoes nativas para um hardware específico.

E saoj, todas as aplicações que citei já são escaladas (a placa de vídeo dos games tem centenas de núcleos), ou rodam em supercomputadores (cinema, meteorologia e finanças) ou rodam com limitaçoes de hardware (seja por preço ou volume - como é o caso das injeçoes eletrônicas, equipamentos de aviação, etc).

E o que fazer quando você já está com o topo do hardware e o tempo ainda é longo?

Agora estou claramente falando de um nicho específico. E que não é tão pequeno quanto alguns membros do GUJ pensam (não é só porque você não atua nesse nicho, que ele seja pequeno). Mas é onde esse bench se aplica.
E NÃO é o caso das aplicações para o qual os sistemas web normalmente são feitos. Para sistemas comerciais esse benchmark tem pouca (para não dizer nenhuma) relevância. Se velocidade do código por si só fosse tão relevante na web jamais falaríamos em javascript ou teríamos sistemas em php. Pra sistemas assim o gargalo está em outro lugar como já citei e você corretamente ressaltou.

A

Johnny, existem casos em que Scala é mais rápida, mas ainda existem alguns poucos em que Java é mais rápida (não sei citar quais mas diz a lenda que existem :D). Algumas construções, tal case class e coleções paralelas, podem aumentar muito a performance se comparadas às “respectivas” construções do Java.

Não sei se você conhece, o grupo para esta linguagem não está muito movimentado ultimamente, mas pode ajudar https://groups.google.com/forum/#!forum/scala-br

[]'s

J

Uma conversa fiada. O que dita a qualidade de um programa são as otimizações que o compilador faz e o quão bom é o profissional que escreveu os algoritmos. É claro que programas java ou escala podem até ser mais rápidos que um c++. Mas isso se o mesmo for escrito por um profissional que não sabe o que faz. Por razões de magnitude código nativo está a um passo afrente. Simplesmente quantidade de código.

Um bom compilador gera assembly enxuto por causa das otimizações, o que é o caso do java, mas mesmo assim o bytecode precisa passar por outras séries de compilações de otimizações. No final isso acaba gerando mais código e talvez nem seja não otimizado quanto um compilador de c++. A responsabilidade pode acabar ficando na mão do profissional de qualquer maneira.

M

Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).

J

moscoso.dev:
Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).

Na “maioria dos projetos” já é forçar a barra. O que existem são situações específicas e ferramentas para solucionar problemas específicos.
Se fosse realmente uma verdade que o compilador de scala gera código mais exuto que o de java eu poderia até optar por ele. Mas como sei que a maioria dos problemas de desempenho se deve a árte do profissional ainda continuo com o java mesmo.

D

juliocbq:
O que existem são situações específicas e ferramentas para solucionar problemas específicos.

Nada contra você em particular, mas na minha opinião essa é a frase mais cretina que existe. Várias pessoas a utilizam quando não possuem conviccoes. É a famosa: Não há bala de prata. É mesmo!!!???

juliocbq:

Se fosse realmente uma verdade que o compilador de scala gera código mais exuto que o de java eu poderia até optar por ele. Mas como sei que a maioria dos problemas de desempenho se deve a árte do profissional ainda continuo com o java mesmo.

A maioria dos problemas de desempenho pode ser simplesmente ignorada. Essa discussão é uma heranca capenga de um passado remoto onde processamento e memória eram escassos.

M

juliocbq:
moscoso.dev:
Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).

Na “maioria dos projetos” já é forçar a barra. O que existem são situações específicas e ferramentas para solucionar problemas específicos.
Se fosse realmente uma verdade que o compilador de scala gera código mais exuto que o de java eu poderia até optar por ele. Mas como sei que a maioria dos problemas de desempenho se deve a árte do profissional ainda continuo com o java mesmo.

Desde que vc use os recursos funcionais ela pode sim gerar código mais enxuto que java porque o compilador é capaz de fazer as otimizações que o compilador Java não consegue.

Na verdade foi exatamente assim que o estudo comseguiu uma versão de Scala mais rápida que java.

J

diegousa:
juliocbq:
O que existem são situações específicas e ferramentas para solucionar problemas específicos.

Nada contra você em particular, mas na minha opinião essa é a frase mais cretina que existe. Várias pessoas a utilizam quando não possuem conviccoes. É a famosa: Não há bala de prata. É mesmo!!!???

Porquê pode ser ignorada?

J

moscoso.dev:

Desde que vc use os recursos funcionais ela pode sim gerar código mais enxuto que java porque o compilador é capaz de fazer as otimizações que o compilador Java não consegue.

Na verdade foi exatamente assim que o estudo comseguiu uma versão de Scala mais rápida que java.

A qualidade do compilador não está relacionada com a sintaxe da linguagem de programação. Por exemplo eu uso dois compiladores de linguagem c. O da microship e o da mikroeletronica. O código gerado por eles é completamente diferente.

M

Aonde eu disse isso?

J

moscoso.dev:

Desde que vc use os recursos funcionais ela pode sim gerar código mais enxuto que java porque o compilador é capaz de fazer as otimizações que o compilador Java não consegue.

Na verdade foi exatamente assim que o estudo comseguiu uma versão de Scala mais rápida que java.

Esse “funcionais” me pareceu referente a isso.

M

juliocbq:
moscoso.dev:

Desde que vc use os recursos funcionais ela pode sim gerar código mais enxuto que java porque o compilador é capaz de fazer as otimizações que o compilador Java não consegue.

Na verdade foi exatamente assim que o estudo comseguiu uma versão de Scala mais rápida que java.

Esse “funcionais” me pareceu referente a isso.

Julio, a idéia é que compiladores modernos são capazes de otimizar programas funcionais. No estudo em questão houve 3x ganho de performance com a versão funcional de Scala, comparado com a versão OO na mesma linguagem.

M
A

moscoso.dev:
Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).


Isso pode não ser problema de acordo com as ferramentas que são usadas. Por exemplo, você pode configurar o SBT para compilar o código de acordo que é alterada.

F

Me parece que o tópico tomou outro rumo, diferente do que proposto, pelo menos com relação ao Titulo do mesmo. A coisa tava virando código nativo versus interpredado Java versus C++

Sobre o título(performance de linguagens que rodam na JVM), eu digo o seguinte: Sim, o que dizem os criadores e usuarios da linguagem Scala, é que ela é tão rápida quanto java, as vezes até mais rapida e em outros casos mais lenta.

O compilador optimiza muito(pudera, o cara é um dos pais do compilador generics do java), por exemplo: apesar de tudo em Scala ser um Objeto, eu posso fazer 1.toString, sempre que possivel, o compilador irá converter o objetos de tipos numéricos do Scala para os tipos primitivos do Java, justamente pela performance.

Sobre tempo de compilação, sim não da pra negar que seja mais lento, talvez 10x seja exagero, mas para isto temos ai o SBT, que compila apenas onde houve alterações e outras coisas mais que ele faz!

J

moscoso.dev:
juliocbq:
moscoso.dev:

Desde que vc use os recursos funcionais ela pode sim gerar código mais enxuto que java porque o compilador é capaz de fazer as otimizações que o compilador Java não consegue.

Na verdade foi exatamente assim que o estudo comseguiu uma versão de Scala mais rápida que java.

Esse “funcionais” me pareceu referente a isso.

Julio, a idéia é que compiladores modernos são capazes de otimizar programas funcionais. No estudo em questão houve 3x ganho de performance com a versão funcional de Scala, comparado com a versão OO na mesma linguagem.

concordo com você. mas isso é mérito do compilador e não da linguagem. Se o compilador de scala gera código mais exuto é ótimo pro pessoal que escreve software pra uma vm. Isso aumenta a qualidade do produto. Mas a relação entre funcional e oo é insignificante para o resultado final que é somente um monte de zeros e uns.

J

fredferrao:
Me parece que o tópico tomou outro rumo, diferente do que proposto, pelo menos com relação ao Titulo do mesmo. A coisa tava virando código nativo versus interpredado Java versus C++

Pois é, mas é que alguns se sentem ofendidos quando o assunto é desempenho e linguagem x. Não sabem que se um compilador gera mais linhas que outro o resultado final é inferior.

J

Obrigado Adelar pela indicação do grupo da linguagem scala.

Realmente esse tópico tomou rumos diferentes, mas o importante é que cada um deu seu parecer.

Pelas qualidades que Scala tem, acredito que seria uma boa evolução se o Java 8,9,10 seguissem o que já está pronto no Scala 2.9.
Isso é apenas uma opinião pessoal.

A

johnny quest:
Pelas qualidades que Scala tem, acredito que seria uma boa evolução se o Java 8,9,10 seguissem o que já está pronto no Scala 2.9.
Isso é apenas uma opinião pessoal.

Seria um grande avanço, mas difícil. Talvez fosse interessante importar o paradigma funcional de Scala… mas daí Java escapa da proposta e se torna outro Lisp. Mas quem sabe quais são os planos da Oracle para o Java 20 :wink:

Acho discussões sobre comparação entre linguagens interessantes, mas são puramente ilusórias, afinal são diversas as variáveis que vão definir as características (plataforma, existência ou não de GC, tecnologia usada para gerar o parser, existência de JIT, inferências de tipos e incontáveis outras). No final cada qual serve para algum propósito ou será abandonada dando lugar outra.

Das linguagens que conheço Scala é a única que se equipara a Java em questão de performance. Dizem que Clojure também possui semelhança em questão de performance, mas nunca usei para afirmar se é verdade. Groovy é legal, mas nem pense em performance quando for usá-la :smiley:

M

Adelar:
moscoso.dev:
Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).


Isso pode não ser problema de acordo com as ferramentas que são usadas. Por exemplo, você pode configurar o SBT para compilar o código de acordo que é alterada.

Desculpe a ignorância, mas o que é SBT?

F

moscoso.dev:
Adelar:
moscoso.dev:
Segundo o estudo citado Scala é 10x mais lenta que Java pra compilar. Essa é uma informação muito mais importante pra mim já que performance de execução não é limitador na maioria dos projetos (CPU não é um recurso escasso), mas agilidade no desenvolvimento sim (desenvolvedor é recurso escasso).


Isso pode não ser problema de acordo com as ferramentas que são usadas. Por exemplo, você pode configurar o SBT para compilar o código de acordo que é alterada.

Desculpe a ignorância, mas o que é SBT?

SBT = Sistema Brasileiro de Televisão :lol:

Brincadeira, é o Simple Build Tool!

M

Pelo que entendi esse tal de SBT consegue detectar e compilar só o trecho que foi alterado é isso? Mas isso não torna o ambiente mais lento, ficar toda hora checando e compilando, não consigo deixar de lembrar de java e suas IDEs. E não digo isso como elogio.

Era algo que gostaria de saber porque só ouço falar de performance de execução, o que é uma pena porque ninguém usa Scala em embarcados mesmo, nem mobile, ou sistemas em tempo real, enfim, onde performance de execução é realmente importante.

J

moscoso.dev:
Pelo que entendi esse tal de SBT consegue detectar e compilar só o trecho que foi alterado é isso? Mas isso não torna o ambiente mais lento, ficar toda hora checando e compilando, não consigo deixar de lembrar de java e suas IDEs. E não digo isso como elogio.

Era algo que gostaria de saber porque só ouço falar de performance de execução, o que é uma pena porque ninguém usa Scala em embarcados mesmo, nem mobile, ou sistemas em tempo real, enfim, onde performance de execução é realmente importante.

Para esse produtos embarcados a melhor opção é um kernel nano linux e linguagem c. O custo benefício é bom, e praticamente só se gasta com hardware.

A

juliocbq:
moscoso.dev:
Pelo que entendi esse tal de SBT consegue detectar e compilar só o trecho que foi alterado é isso? Mas isso não torna o ambiente mais lento, ficar toda hora checando e compilando, não consigo deixar de lembrar de java e suas IDEs. E não digo isso como elogio.

Era algo que gostaria de saber porque só ouço falar de performance de execução, o que é uma pena porque ninguém usa Scala em embarcados mesmo, nem mobile, ou sistemas em tempo real, enfim, onde performance de execução é realmente importante.

Para esse produtos embarcados a melhor opção é um kernel nano linux e linguagem c. O custo benefício é bom, e praticamente só se gasta com hardware.


A compilação é feita por arquivo modificado, então para compilar não é demorado a não ser que sejam enviadas diversas alterações de uma só vez. Mas depois de construída a aplicação que vem o problema… e o tempo de deploy? Uma forma (não sei se tem outras) é se utilizar de jrebel daí para carregar as alterações na aplicação que está executando.

Já sobre mobile, já há quem use para desenvolver para Android.

Criado 30 de setembro de 2011
Ultima resposta 5 de out. de 2011
Respostas 36
Participantes 12