segunda-feira, 8 de setembro de 2008

Usando gij e gcj no lugar do javac

Mostrarei como desenvolver programas java usando as ferramentas do projeto gcc (http://gcc.gnu.org/).

Começamos baixando os pacotes de desenvolvimento e de execução, são o gcj e o gij.

Para o ubuntu use o apt-get para isso:

# apt-get install gcj gij

O gcj é o compilador, e o gij é o interpretador bytecode java.

Veja o exemplo:


Hora.java


class Hora {

    private int hor, min, seg;
    public int getHoras () {return hor;}
    public int getMinutos (){return min;}
    public int getSegundos (){return seg;}
    public void setHoras (int h) {
          if (h >= 0 && h < 24)
                    hor = h;
    }
    public void setMinutos (int m) {
          if (m >= 0 && m < 60)
                    min = m;
    }
    public void setSegundos (int s) {
          if (s >= 0 && s < 60)
                    seg = s;
    }
    public void setHorario (int h, int m, int s) {
          setHoras (h); setMinutos (m); setSegundos (s);
    }
    public String toString () {
          return getHoras() + ":" + getMinutos() + ":" + getSegundos();
    }
}


UsaHora.java



import java.util.Calendar;
public class UsaHora {
   public static void main (String args[]) {
         //declara e instancia um objeto tipo Hora
         Hora hora = new Hora();
         //atribui valores ao objeto com valores válidos
         hora.setHorario (15, 30, 10);
         //exibe hora
         System.out.println ("Hora: " + hora.toString());
         //Pega data atual
         Calendar dataAtual = Calendar.getInstance();
         //declara, instancia e atribui valores a outro objeto do tipo Hora
         Hora outraHora = new Hora();
         int h = dataAtual.get (Calendar.HOUR_OF_DAY);
         int m = dataAtual.get (Calendar.MINUTE);
         int s = dataAtual.get (Calendar.SECOND);
         outraHora.setHorario (h, m, s);
         //exibe hora atual
         System.out.println ("Hora atual: " + outraHora.toString());
   }
}








Copie e cole os programas java acima.

Usando o método tradicional, com o java, você faria assim:

# javac Hora.java
# javac UsaHora.java
# java UsaHora
Hora: 15:30:10
Hora atual: 20:41:45
#

Usando o gij e o gcj, faremos assim:

gcj Hora.java -C
# gcj UsaHora.java -C
# gij UsaHora
Hora: 15:30:10
Hora atual: 20:41:45

Para que server o "-C" ?
Isso é para dizer para o compilador para gerar o código em bytecode java. Isso significa que, com o gcj, você pode gerar o código para a máquina nativa.
Ou seja, com o gcj você pode gerar um executável diretamente para a máquina que executará o programa, para fazer isso use o seguinte comando:

# gcj --main=UsaHora Hora.java UsaHora.java -o UsaHora
# ./UsaHora
Hora: 15:30:10
Hora atual: 20:47:5

Aqui dizemos ao compilador para usar a estrutura da classe UsaHora como main, e para incorporar os arquivos Hora.java e UsaHora.java para compilar de uma vez, gerando um código objeto UsaHora

Aqui, no caso, geramos um código ELF, que é um executável linux. Mas se o gcj for instalado no Windows, basta fazer o mesmo comando, porém colocando um ".exe". assim:

c:\ gcj --main=UsaHora Hora.java UsaHora.java -o UsaHora.exe
c:\UsaHora
Hora: 15:30:10
Hora atual: 20:47:5

Em geral os códigos para máquina virtual são muito rápidos, dando pouca diferênça de performance. Você pode fazer esse teste gerando loops grandes tanto em C como em Java para constatar isso.

segunda-feira, 16 de junho de 2008

Melhorando desempenho do Linux (usando o pendrive)

Em um último post que fiz, sobre melhorar o desempenho do Windows, tendo como ferramenta em mãos um pendrive (, não coloquei o Linux como outro SO beneficiado.

Bem... eu realmente não esqueci. É que o tema merece um capitulo à parte e usando a mesma teoria (veja o artigo comentado acima para entender melhor) podemos melhorar o Linux também.

Mas lembrando que os benefícios são inversamente proporcionais a quantidade de memória física disponível, ou seja, um servidor com 256MB de ram rodando web (apache) + email (postfix) + banco de dados (postgresql) + antispam + webmail + alguns usuários simultâneos (uns 50) já são o suficiente para pouco desempenho do sistema.

Não vou entrar nos detalhes sobre o custo da compra de mais memória ou troca de equipamento. Pois certamente sempre é possível fazer um bom negócio e , com um pouco de investimento, adquirir um equipamento melhor. Assim consideramos nesse nosso experimento apenas a melhoria com um pendrive de 256M ou mais.

A vantagem é a ativação da memória virtual por USB sem precisar desligar o equipamento. Se não sabe exatamente do que estou falando, ainda reforço para você a leitura do artigo comentado no começo do texto.

Então vamos com a mão na massa!

Primeiro seu servidor tem que estar habilitado com a capacidade de USB. Falo aqui de um kernel relativamente novo (2.6.xx apesar de já funcionar bem com o 2.4.xx e 2.2.xx).

Drivers USB:
se seu kernel não esta com os modulos carregados automaticamente, não há problema; carregue o drive usb_storage, ele carregará os outros drivers necessários (como o usbhid, uhci_hcd).

se observar pelo comando dmesg | grep sd , voltará a seguinte informação:
-------.-----------.-----------.-----------.---------.-
USB Mass Storage support registered.
usb-storage: device scan complete
scsi 2:0:0:0: Direct-Access Kingston DataTraveler 2.0 PMAP PQ: 0 ANSI: 0 CCS
sd 2:0:0:0: [sdd] 15646720 512-byte hardware sectors (8011 MB)
sd 2:0:0:0: [sdd] Write Protect is off
sd 2:0:0:0: [sdd] Mode Sense: 23 00 00 00

sd 2:0:0:0: [sdd] Assuming drive cache: write through
sd 2:0:0:0: [sdd] 15646720 512-byte hardware sectors (8011 MB)
sd 2:0:0:0: [sdd] Write Protect is off
sd 2:0:0:0: [sdd] Mode Sense: 23 00 00 00
sd 2:0:0:0: [sdd] Assuming drive cache: write through
sdd: sdd1 sdd2 -------.-----------.-----------.-----------.---------.-


Ok, o drive USB esta disponível, mas como usar a memória virtual?

Você pode fazer o seguinte:

1) Se o pendrive for exclusivamente para isso (apenas se for pequeno):

voce pode formatar o pendrive inteiro com o comando

# mkswap /dev/sdd1

Para adicionar o swap(memória virtual) ao sistema em operação:

# swapon -p 1 /dev/sdd1

onde o "-p 1 " significa que a prioridade é ligeiramente maior que o algum outro sistema swap já montado.

2) se o pendrive será usado, em parte, como um de 8G, repartiremos no seguinte:

7,5G para arquivos e 0.5G no swap.

fdisk /dev/sdd

e a seguinte sequência de teclas de comandos:
d -> n -> p -> 1 -> -> +7500M ->
n -> p -> 2 -> -> -> a -> 1 -> t -> 2 -> 82 -> w

onde :

d -> o d é para apagar a partição existente (faça um backup dos dados antes de apagar tudo)
n -> isso criará uma nova partição
p -> a partição será primária
1 -> o número da partição
-> seria a prória tecla "enter" do teclado
+7500M -> significa adicionar 7500Mbytes (ou 7,5G e se tirar isso dos 8G, ainda sobrará 0.5 G)
a -> diz quem será a partição primária
t -> modifica o tipo do sistema de arquivos
82 -> o tipo de sistema de arquivos é o "linux swap"

para finalizar o "w" que grava tudo que foi feito e ativa as modificações.

nesse momento é só repetir o processo das dicas do item 1:

você pode formatar o pendrive inteiro com o comando

# mkswap /dev/sdd2

Para adicionar o swap(memória virtual) ao sistema em operação:

# swapon -p 1 /dev/sdd2


Com o servidor mencionado no começo do artigo a adição de uma memória flash USB 2.0 de mais de 256M ,isso por causa da quantidade da memória, ou mais de 4G ,por cauda do desempenho das tecnologias mais atuais, é uma maneira simples, rápida e pouco intrusiva, sem abrir equipamento ou parar o sistema.

Com esse artifício o servidor web tem uma resposta melhor e nos gráficos por mês, aumentou em 20% nos acessos por minuto, e 50% nos acesso ao I/O (entrada e saída) do pendrive.

Ainda pude me arriscar a ligar o antivírus, pois apesar do recurso gastar um bom processamento, o sistema operacional consegue liberar e recuperar a memória virtual rápidamente com o pendrive.

sábado, 14 de junho de 2008

Melhorando desempenho do Windows XP/2000 (usando o pendrive)

Lendo alguns artigos sobre os aperfeiçoamentos feitos no Windows Vista e fiquei curioso sobre o ReadyBoost.
Diz o anuncio da MS que essa tecnologia permite que o Windows, aumente a performance de carga e uso das aplicações. Fiquei me perguntando, como é que funciona?

A idéia baseia-se na arquitetura das memórias flash USB (os PenDrives). Diferentemente dos discos rígidos (os HDs), nas memórias flash o tempo para acessar qualquer lugar na memória é, praticamente, nulo.

Significa que um arquivo extremamente fragmentado no pendrive terá quase a mesma velocidade que o acesso de um arquivo gravado linearmente. Mas o que isso significa?

Vejamos uma situação prática. Você esta trabalhando num escritório de um cliente, desenvolvendo um sistema para ele, o computador disponível tem um processador relativamente bom de 1.8GHz (AMD), com 512MB de ram, 1 HD de 80GB e Windows XP. Porém depois de abrir o navegador (Firefox) para ver o resultado feito por uma interface de desenvolvimento - IDE - (NetBeans) que conecta em um banco de dados (Postgresql) que é alimentado por informações digitadas em uma plataforma de editoração de banco (OpenOffice). Pronto... seu computador ficou impraticavelmente lento e se reparar bem na luzinha do HD, estará piscando incansavelmente.

A luz pisca pois o SO (WinXP) esta usando a memória virtual, pois a real acabou, e significa que esta lendo e gravando movimentando-se para vários lugares aleatóriamente em um arquivo especial chamado c:\pagefile.sys . E se na tela eu mudo do navegador para a IDE o SO vai começar a descarregar dados do firefox no pagefile e ler, do mesmo arquivo, dados do NetBeans. além disso é possível que partes do programa tenham que ser relidos.

Como o pagefile e o IDE estão no mesmo disco, então espera-se carregar um e, depois, carrega-se o outro.

Agora faremos o seguinte, colocamos um pendrive de 8G, configuramos um arquivo de memória virtual nele e, por fim, fazemos todo o nosso trabalho. O que muda?

As diferenças são as seguintes:

- os dados em memória dos programas são lidos e gravados em várias partes da memória flash, que tem o acesso randomico mais rápido.
- enquanto isso é possível ler partes do programa do HD, que esta desfragmentado (espero!) e se foram peços grandes, terão o benefício da leitura sequencial de alta velocidade.

A velocidade de leitura e gravação randomica do USB + a velocidade de leitura e gravação sequencial do HD.Isso somado ao paralelismo do acesso simultâneo dos dois discos.

Sim há ganho de performance. O efeito prático mais visível é no momento da troca de tarefas, quando sem o pendrive o primeiro e o segundo programas ficam momentâneamente travados enquando o disco enlouquecedoramente pisca. Já com o pendrive, apenas a primeira tarefa fica ligeiramente enrroscada, já a segunda começa a ser desenhada e as luzes do pendrive e do HD piscam simultâneamente.

Para habilitar essa facilidade acesse as propriedades do computador, avançado, desempenho, configurações, opções de desempenho, avançado,memoria virtual, alterar; nas opções de unidade coloque o drive do pendrive e escolha um tamanho personalizado, inicial 1024 e final 1024 , em seguida basta clicar "definir" e dar os consecutivos "OK"s. Não é necessário reiniciar.



Esse percurso de configuração é parecido no Windows 2000 e no 2003.

E é claro, quanto mais memória ram você tiver ( maior ou igual que1G) menos precisará dessa técnica