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.
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.
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.380sCompilando 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.172sCompilando 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.988sAbaixo 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
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.