Diferença de performance entre as versões do OpenSDK e da Sun

Senhores,

desenvolvi um programa que realiza o parser em um arquivo texto que possui o tamanho de 51Mb e tem várias peculiaridades (não é XML).

Estava executando ele no Ubuntu 9.1 com a versão da Sun: Java SDK/JRE versão Sun 1.6.0_20-b02 e Java HotSpot 64 Bit Server VM (build 16.3-b01)
Resolvi fazer um teste com o OpenSDK: OpenJDK Runtime Enviroment (IcedTea6 1.6.1 ? 6b16-1.6.1-3ubuntu3) e OpenJDK 64 bit Server VM (build 14.0-b16)

A diferença de performance (medida com o comando time do linux) foi de:
Sun: real 23.248s user: 24.070s e sys: 1.910s
OpenJDK: real 18.617s user 22.340s e sys 1.570s

Os parâmetros para as VM foram as mesmas: -d64 -server -Xms1024m -Xmx1024m

Alguém sabe se o OpenSDK está confiável para por em produção? Alguém já está utilizando ele em ambiente web com o tomcat 6?

Valeu

Oi Dieval,

Movi o seu tópico para o Java Avançado. Acho que o pessoal do básico não deve fazer esse tipo de análise.
Nunca usei o OpenJDK e fiquei bem empolgado com esses resultados. Vou acompanhar esse tópico de perto também :slight_smile:

Se não me engano, as implementações de XML no OpenJDK e no JDK normal da Sun são um pouco diferentes (não sei qual delas anda mais atrasada em relação à outra).

De qualquer maneira, a JVM que vem com o OpenJDK, se não me engano, está na versão que virá com o Java 7, e essa JVM tem algumas melhorias de desempenho em relação à JVM do Java 6.

Opa valeu Vinicius (parabéns, hoje que vi que você se tornou moderador),

Entanglement, a aplicação que descrevi e que ficou quase 25% mais rápida, não utiliza xml. O programa utiliza muita substring, expressões regulares, comparações etc.

abs

Há algum tempo ví um análise do Cabelo do Viva o Linux que mostrava as diferenças entre um programa simples compilado usando o gcj e javac. No caso algumas tarefas ficaram melhor rodando via gcj, e outras no javac. Creio que no seu caso alguma instrução para ler esse arquivo possa ser mais otimizada no OpenJDK, ou seja, não que o OpenJDK seja mais rápido, talvez esses métodos que você usou são mais rápidos, ou talvez o próprio compilador do OpenJDK pode ter feito alguma otimização.

Há algum tempo eu fiz uns testes com o IcedTea, que nada mais é que o OpenJDK empacotado pela Redhat apenas com dependências livres, e tive uma boa impressão com o projeto. Os testes que eu fiz foi em meados de 2007/2008.

Aprofundando o tópico, há também uma implementação da API JSE da Apache, o Harmony, que visa ser uma implementação com uma licença mais flexível que a GPL.

Eu fiz dezenas de benchmarks entre essas duas versões e pude constatar que o openjdk está bem afrente do kit da oracle.
Entre as melhorias:

  • Coletor de lixo g1, que usa um algoritmo bem diferente do outro.(Muita diferença de desempenho, a sensação é quase tempo real)
  • java2d otimizado.
  • Algumas alterações no nio

entre outras…

Realmente compensa usar o openjdk ou os splashs do jdk7.

Agora para produção creio que devem ser feitos testes de campo para ter certeza da estabilidade.

Este eh o grande ponto, na minha opiniao. OpenJDK eh um projeto relativamente novo ainda, mas cujos fontes foram baseados nos codigos da propria Sun. As partes que nao sao originarias da JVM da Sun sao partes com codigos assembly (que estao em processo de conversao) e codigos cuja Sun nao tinha direitos para redistribuir.

O que quero dizer eh que ele deve ser tao ou mais estavel do que a JVM da Sun, mas eh sempre bom fazer testes, independente da VM que sera utilizada. Dependendo de quao critica eh sua aplicacao, vale a pena dar uma navegada pelo bugzilla do OpenJDK pra ver se algum bug serio pode te afetar.

Senhores,

apenas para registrar,

refiz o parser utilizando expressões regulares na maior parte do código e a coisa se inverteu, os tempos ficaram em:

OpenSDK 5.037s
Sun: 3.557s

Ou seja, a biblioteca de expressões regulares da Sun possui um desempenho melhor que a versão do OpenSDK.

fw

[quote=Dieval Guizelini]Senhores,

apenas para registrar,

refiz o parser utilizando expressões regulares na maior parte do código e a coisa se inverteu, os tempos ficaram em:

OpenSDK 5.037s
Sun: 3.557s

Ou seja, a biblioteca de expressões regulares da Sun possui um desempenho melhor que a versão do OpenSDK.

fw[/quote]

Pode não ser isso. As vezes é o algoritmo implementado. Dá uma olhada no profiler do netbeans e analise os metodos internos que são chamados.