Pular para o conteúdo

GCJ – Conhecendo o compilador Java Livre

Com a repercussão gerada quando a Sun resolveu disponibilizar o código fonte do Java, resolvi testar o Java Livre. O projeto GCJ da GNU é um compilador Java totalmente livre, onde o desenvolvedor pode gerar bytecode ou código binário nativo. Não sou especialista em Java, mas fiquei surpreso ao executar os testes mencionados neste documento.
Alessandro de Oliveira Faria (A.K.A. CABELO) CABELO
Hits: 30.977 Categoria: Java Subcategoria: Avançado
  • Indicar
  • Impressora
  • Denunciar

Parte 4: Testando a performance (compactando um vídeo mpeg)

Escolhi um programa em Java que compacta um arquivo MPEG para testar a performance de execução. O principal motivo que levou a esta escolha foi a compactação que exige um pouco de cálculo e a leitura e gravação em disco (assim conseguindo obter resultado com I/O).

Baixe o programa Glauber Brilhante no Viva o Linux e descompacte com o programa unzip como no exemplo abaixo:

$ unzip Zip.zip
Archive: Zip.zip
  inflating: Zip/Zipando.java

O programa efetua a compactação de um programa informado pelo teclado. Como o objetivo é verificar a performance, efetuei algumas alterações para o código assumir sempre determinados valores. Abaixo menciono as linhas que a serem alteradas.

Quem preferir adquirir o código já alterado, efetue o download em:
Para efeito de informação, explicarei passo a passo as alterações. Primeiro entre na pasta criada Zip e edite o programa Zipando.java.

$ cd Zip/
$ vi Zipando.java


Na linha 31 o programa solicita a digitação do nome do arquivo destino (arquivo zip a ser criado). Sendo assim comentei a linha 31 e atribui na linha 32 uma constante na variável SAIDA.

     31    // saida = leia.readLine();
32 saida = "video.zip";

Já na linha 55 o programa solicita a digitação do tipo de informação a ser compactada 1=arquivo e 2=pasta. Novamente comentei a linha 55 e atribui na linha 56 o retorno da constante 1.

     55    //return leia.readLine();
     56    return "1";

Agora na linha 89 o programa solicita a digitação do nome do arquivo origem (nome caso utilizei o arquivo de vídeo tst.mpg). Então comentei a linha 89 e atribui na linha 90 uma constante na variável nome.

     89 // nome = leia.readLine();
     90  nome ="tst.mpg";

Agora compile com o gcj, gij e com o javac o nosso programinha, execute com o comando time para analisarmos os resultados como no exemplo abaixo:

ATENÇÃO: Ressalto que executei o programa 2 vezes para não criar falso resultados em função do cache de disco.

Compilando e executando com o Java:

$ javac Zipando.java
$ time java Zipando

Zipando.java
Zipando arquivos ou pastas

Digite o nome do arquivo a ser gerado:
Selecione..compactacao de:
1. Arquivo
2. Pasta
Opcao:
Digite o nome do arquivo a ser zipado:
Compactando: tst.mpg

Arquivo zipado com sucesso!
real    0m24.482s
user    0m19.613s
sys     0m1.380s
Compilando e executando com o gcj:

$ gcj -o Zipando --main=Zipando Zipando.java
$ time ./Zipando

Zipando.java
Zipando arquivos ou pastas

Digite o nome do arquivo a ser gerado:
Selecione..compactacao de:
1. Arquivo
2. Pasta
Opcao:
Digite o nome do arquivo a ser zipado:
Compactando: tst.mpg

Arquivo zipado com sucesso!
real    0m12.600s
user    0m10.565s
sys     0m1.172s
Compilando com o gcj e executando com o gij:

$ gcj -C Zipando.java
$ time gij Zipando

Zipando.java
Zipando arquivos ou pastas

Digite o nome do arquivo a ser gerado:
Selecione..compactacao de:
1. Arquivo
2. Pasta
Opcao:
Digite o nome do arquivo a ser zipado:
Compactando: tst.mpg

Arquivo zipado com sucesso!
real    0m13.225s
user    0m9.365s
sys     0m0.988s
Abaixo os resultados:
-----------------------------
! Execução        !  Tempo  !
! Java bytecode   ! 24.482s !
! Código nativo   ! 12.600s !
! gij bytecode    ! 13.225s !
-----------------------------
Quero deixar bem claro que o objetivo deste documento não é gerar polêmica, muito menos classificar como melhor ou pior determinada tecnologia, e sim disponibilizar os teste efetuados na NETi TECNOLOGIA junto a equipe de desenvolvimento e pesquisa da empresa.

Alessandro de Oliveria Faria (CABELO)
Analista de Negócios
http://www.netitec.com.br/alessandro

   1. Introdução e instalação:
   2. Compilando e testando um programa exemplo
   3. Gerando um bytecode com o programa "OLA MUNDO"
   4. Testando a performance (compactando um vídeo mpeg)

SUNO OpenSource: Crie um servidor de gerador de música com IA

Como instalar um cartão PCMCIA (modem/rede) no meu notebook?

Neste Natal: liberte o seu Motorola Atrix, e o transforme no desktop perfeito

Torne o seu servidor um mirror de atualização do Antivírus AVG (revisão)

Transmitindo vídeo de eventos ao vivo via Internet com GNU/Linux

Funções Completas - Comunicação entre aplicações Android e FTP

Linux com Java 1.7 + JBoss 7

Redirecionamento de páginas e domínios com Jetty Rewrite Handler

Configurando e-Gen + Tomcat + JSDK

PDFBox - Aplicativo Java para baixar o DOU completo

#1 Comentário enviado por removido em 05/07/2006 - 11:10h
Legal.
Eu sabia da existência do GCJ, mas não sabia q ele gerava código nativo, e tbém nunca havia utilizado ele por causa de suas restrições. Atualmente estou desenvolvendo um software relativamente grande em Java, e estava preocupado com a performance, eu tava mesmo querendo gerar código nativo. O problema é que ele está 100% em J2SE 5.0, e com o GCJ não tenho como utilizar todos os recursos. Seria legal se os desenvolvedores conseguissem manter o GCJ sempre com as mesmas características da JVM da Sun.
#2 Comentário enviado por jragomes em 05/07/2006 - 11:44h
Cabelo,
Parabéns, mais uma vez trazendo um artigo bom, bem explicativo e trazendo coisas novas.

#3 Comentário enviado por leibniz em 05/07/2006 - 15:19h
A função "import javax.swing.JOptionPane;" funciona no gcj.
#4 Comentário enviado por drausio em 05/07/2006 - 17:31h
Ae Cabelo!!!!

Cara muito xique heim!
Parabéns mais uma vez... =)
#5 Comentário enviado por anunakin em 06/07/2006 - 20:18h
Fale cabelo,
Inclusive conseguimos usando o GCJ fazer os plugins JAVA (JavaApplets) funcionarem no Firefox do Zaurus, um PDA com Linux e processador ARM PXA270.. Coisa alias que a SUN fez foi desprezar totalmente os PDAs e por o J2ME como default... putz 640Mhz, Firefox, KDE, C++ e usar J2ME é cruel....

Para conferir:
http://www.oesf.org/forums/index.php?showtopic=18988&hl=java
#6 Comentário enviado por sombriks em 07/07/2006 - 03:28h
Massa Cabelo!

eu estou aprendendo java e realmente é legal saber que já possuo alguma possibilidade de produzir código nativo. O chato é a coisa do J2SE 5, como o tiagozc já falou. espero que a turma aí do GCJ nos dê mais alegrias, :D
#7 Comentário enviado por EmanuelSan em 07/07/2006 - 09:23h
Fiz os testes na minha máquina com FC5 usando o programa Zipando.java disponibilizado pelo CABELO e consegui os seguintes resultados:

IBM Java 1.5.0 12.573s
GCJ 4.1.1-1.fc5 12.901s
GIJ 4.1.1-1.fc5 13.228s
SUN Java 1.5.0.07 19.173s

Meu arquivo tst.mpg tinha 100M. Refiz cada teste várias vezes e peguei o melhor resultado de cada. Olha que surpresa! O JIT que vem no JDK da IBM parece muito bom.
#8 Comentário enviado por anunakin em 07/07/2006 - 09:52h
Esse JRE da IBM e o GCJ são os únicos que estão funcionando bem no meu AMD64 ... o da sun é só bugs e paw toda hora .. trava o firefox, uma tristeza...
#9 Comentário enviado por cwars em 11/09/2007 - 18:47h
Eu havia lido um artigo de o porquê do GCJ e gij terem maiores performances que javac e java normal, mas os motivos são simplesmente que no GCJ e gij eles tiraram muitos dos overheads que exitem no java (como leitura e verificação de código para depois executar, linkagem dinâmica, sistemas de analize e segurança e entre outros), gerando uma forma que possa ser executada mais rapidamente, contudo mesmo o código compilado em código nativa continua sendo gerenciado e dependendo so gij para rodar, coisa que não poderam corrigir devido ao coletor de lixo.
#10 Comentário enviado por removido em 14/02/2008 - 11:15h
Bom artigo eu gostei apesar de nunca ter testado o Gcj...
#11 Comentário enviado por removido em 16/08/2009 - 02:13h
@CABELO
O quê está acontecendo com seus links?
Por que eles não seguem?
Eu estou procurando um compilador para Java e não estou muito afim de usar Windows, mas lendo seu artigo vi que os links estão falhando.

Contribuir com comentário

Entre na sua conta para comentar.