Jump to content
Sign in to follow this  
Dabubble

A velocidade de Java - Mitos e verdades - .NET beware

Recommended Posts

Dabubble

Pois e pessoal, apesar de ja ser antigo o facto de que Java tem melhorado bastante a nivel de peformance (quando digo Java digo o proprio motor de compilacao, execucao e gestao de memoria (garbage collection) e nao frameworks comerciais feitas em Java, mas so agora encontrei um artigo suficientemente explicito.

Vejam a tabela de comparaçao entre Java e outras linguagens que inclui as 3 linguagens do .NET (J#,C# e VB) neste site:

http://osnews.com/story.php?news_id=5602&page=3

E a sun preve bastantes melhorias para a versao 1.5....

Share this post


Link to post
Share on other sites
ouvi_dizer

A SUN tem investido bastante na optimização da JVM, código intermédio e interfaces com os sistemas operativos, exactamente para combater estas criticas de velocidades.

Bom Artigo

Share this post


Link to post
Share on other sites
Johnny Digital

Boas eu estou a desenvolver um raytracer estilo doom em java, usando apenas as classes mais basicas, nao o interface 3d, com a intencao de o portar para outras linguagens e tou espantado com a velocidade do java!

penso logo que possivel fazer o port para C++ (como o codigo está feito será bastante facil) para uma comparacao final

Share this post


Link to post
Share on other sites
Dabubble

Força ai!!

Vais postando novidades e se kiseres disponibiliza o código. Já agora estou curioso como estas a fazer código java que seja portável para c++. Tens de abdicar de uma das coisas mais porreiras de C++ a hereditariedade multipla.

Share this post


Link to post
Share on other sites
Johnny Digital

ah pois eh... mas para obter uma grande performance e um footprint reduzido ah q cortar em tudo o q se pode cortar, ate no java...

eh provavel que a linguagem final n seja o c++ mas apenas c (eh bastante mais confortavel para mim, visto que ainda sou das alturas em q nos ficavamos pelo DOS)

ainda vou investigar a possibilidade de colocar o codigo fonte algures online, mas soh quando tiver o jogo mais concluido, por enquanto tv poste um screenshots :)

joao

Share this post


Link to post
Share on other sites
Destineo

Boas tardes,

Quero atirar aqui umas achas para a fogueira para se discutir realmente a diferença de velocidade entre Java e outras linguagens que são compiladas nativamente, como por exemplo ****(C#, VB, etc).NET.  :cheesygrin:

Primeiro existe uma grande diferença entre Java e as outras linguagens que ninguém referiu, que é o facto de Java correr sobre uma JVM (Java Virtual Machine), e portanto o código não estar já compilado para instruções específicas da máquina onde está a correr.  😲  Quê ?!?!?!? Bom, passo a explicar. Compilar um programa java dá origem a um ficheiro de java bytecodes que depois são interpretados pelo JVM e só aí é que são executadas as instruções sobre a máquina. Em máquinas Intel/AMD, o conhecido Assembler é a linguágem que está mais perto dos componentes da máquina. Os bytecodes de que falo, ainda são interpretados e só depois é que são executadas as instruções Assembler sobre a máquina. Portanto a velocidade do Java também tem a haver com a JVM onde está a correr e sim, existem outros JVM sem ser os da Sun.

Um pequeno à parte : Existe um rumor de um dia haver um processador que execute directamente java bytecodes, mas ainda continua a ser um rumor.

Agora se compilarmos um programa .NET, temos um ficheiro executável que já é um ficheiro de instruções da máquina onde irá correr. Ou seja, estas instruções não são interpretadas por nenhum outro programa, mas sim executadas logo sobre a máquina.

Como podem ver, existe aqui um pequeno bocado de software entre o nosso programa java e a máquina em si. Logo ai, perdemos performance na velocidade. É claro que com novas VM's a serem lançadas essa perda de performance vai diminuindo, mas dificilmente poderá chegar a uma velocidade comparável com código compilado nativamente para uma máquina. É neste último ponto que o java ganha vantagem.

Visto que o java dá origem a uma serie de bytecodes java, que são iguais em QUALQUER sistema que suporte java, esse mesmo programa pode, com 95% certeza, correr logo em qualquer ambiente (UNIX, Windows, Linux, MaxOS, etc) sem ter de ser recompilado. Os outros 5% podem ter de ser afinados para poder correr melhor nos outros sistemas. No entanto, para um programa C/C++, o programa terá de ser compilado em cada um dos ambientes, e provavelmente até alterado de modo a funcionar nos diferentes ambientes.

.NET também tem ainda outra desvantagem em relação ao Java. Pode-se fazer aplicações inteiras de graça, e pôr a correr em sistemas grátis (usando Eclipse, JBoss, Apache Tomcat, etc) em qualquer ambiente, e para aplicações .NET, precisas do .NET Studio, que até agora, ainda é pago e só funciona em Windows.

Voltando à questão principal, a evolução dos interpretadores de Java tem trazido os java bytecodes cada vez mais perto da máquina onde estão a correr, e isto trará nova vida à velocidade das aplicações Java. Só o tempo o dirá, e quem sabe não passaram a existir processadores mistos que interpretem código Java e também instruções nativas da máquina.

-Destineo


- Destineo

Share this post


Link to post
Share on other sites
nuno.reis

Boas,

  O C# gera um exe mas em managed code, que não é assembly, e tens de ter a .NET framework para que este corra. O procedimento é em tudo análogo ao Java, só tens a .NET framework em vez da JVM "por baixo". Ou seja, a comparação entre estas duas linguagens é perfeitamente justa ao nível da performance uma vez que nenhuma delas gera código máquina, mas códigos intermédios que são depois interpretados.

  Além disso a plataforma .NET é livre... tens diversos programas (vide SharpDevelop) que são IDEs que te permitem programar em C#, inclusive tem um modo gráfico para editar as forms e que são livres. No extremo, tendo a framework .NET instalada podes mesmo compilar pela linha de comandos usando o comando csc.

  Para linux existe uma framework que é a mono que corre esses exe em managed code mas em linux... e que também tem uma IDE gráfica própria e podes mesmo programar e compilar em linux... e correr em linux ou em windows...

  Quanto à performance.. os números falam por si.

  Não sou grande apreciador da tecnologia microsoft, mas trabalho com o Visual Studio (este sim pago) e em C++ e C# e esta ferramenta (assim como a linguagem C#) é tão boa que nem parece feita pela Microsoft.

  P.S. - O C# também pode gerar código máquina, normalmente referido como unsafe code (pq será???) e utilizar ponteiros e tudo o que usas em C++. Assim tem o melhor dos dois lados

  Reis

Share this post


Link to post
Share on other sites
Destineo

Boas Reis,

Como já estou no mundo Java há algum tempo, tenho mais conhecimentos nesse sentido. Obrigado pelo esclarecimento sobre .NET, pois tanto eu como outros a ler ficaram a saber mais algo.

Vendo as coisas assim, realmente fico bastante mais feliz por saber que o java está a conseguir ganhar pontos desta forma.

- Destineo


- Destineo

Share this post


Link to post
Share on other sites
Dabubble

So para que fique bem claro todo o codigo produzido em managed C++, ou em C#,J# VB (todos .NET) corre sobre uma VM (a .NET framework). Ou seja o codigo e interpretado mas nao compilado (pelo menos nao como vai correr na maquina). Isto tudo tal e qual como Java.

So para concluir nao confundir managed code com codigo que corre sobre uma VM podes ter managed code sem VM. (existem libs para isso) A VM faz muito mais do que garbage collection (a definicao de managed code e que e codigo que corre com um garbage collector que trata de gerir a memoria). Uma VM tem muito mais features (ClassLoading, Security etc...)

Share this post


Link to post
Share on other sites
nuno.reis

Boas,

"Managed code is code executed by a .NET virtual machine", isto é, não podes ter managed code sem uma VM (doutra forma não seria managed)

Podes ver nestes links a definição de managed code...

Criadores do manged code: http://msdn.microsoft.com/archive/default.asp?url=/archive/en-us/directx9_m_dec_2004/directx/whatismanagedcode.asp

Uma referência que temos como mais ou menos certa:

http://en.wikipedia.org/wiki/Managed_code

Share this post


Link to post
Share on other sites
Dabubble

Isso e a definicao da microsoft,ate e curioso que nem se refiram a outras plataformas, uma vez que a primeira vm que surgiu (pelo menos mass-market) foi a de java. Mesmo assim a definicao de managed code vem do facto de esse codigo correr com acesso ou sobre um gestor de memoria (o manager) que trata da utilizar da forma mais eficiente isto e o codigo e gerido se tu tiveres um programa que tenha uma lib de garbage collection e a uses sobre todo o programa ele e managed, a definicao de vm vem de runtime environment (http://computing-dictionary.thefreedictionary.com/managed+code) e isto foi a evolucao do conceito agora tu podes ter um programa que inclui ele proprio o seu runtime environment usando para isso libs que providenciam essas facilidades.

Normalmente os runtime environments fazem mais do que so gerir a garbage collection eles asseguram que um programa que esteja a correr dentro deles nao possa aceder a endereços de memoria fora deles providenciando assim algum tipo de segurança tambem.

Share this post


Link to post
Share on other sites
Knitter

Já agora, o Java permite, há bastante tempo já, compilação nativa, que é algo usado pela máquina virtual servidor. Para os que não sabem, existem dois tipo de jvm, uma cliente e uma servidor, a cliente a mais utilizada, é a que vem com o jre ou jdk normal, a servidor é usada por aplicações "enterprise" e a diferença entre o desempenho das duas maquinas é enorme.

Em relação ao .net, nas palavras de um dos representantes em Portugal da microsoft, "... sim o .net, por todas as suas caracteristicas, é mais lento que o Java da Sun...". Uma das caracteristicas que torna o .net mais lento é a de segurança, o código que corre em .net passa obrigatóriamente por mecanismos que, teóricamente, impendem danos na máquina onde está a ser executado, isto é, em teoria é mais dificil fazer virus em .net. Seja como for, os programadores continuam com a ideia de que java e .net são mais lentos que C/C++, e normalmente um simples programa em c/c++ é mais rápido mas isso é culpa do programador e não da linguagem/plataforma. Mesmo depois de tantos destes debates vejo programandores a fazerem autênticas asneiras em Java, usarem mal a programação OO.

Enfim, é mais um dos vários debates que nunca terão fim, já agora se querem uma linguagem rápida usem fortran, é muito mais rápida que qualquer C/C++!

Peace.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.