não to conseguindo diminuir o uso da CPU espalhando Thread.sleep() no codigo (resolvido)

pessoal, esse metodo ta elevado a CPU a 80, 90 %, sendo que nas primeiras loopadas o numero é menor, masi vai aumentado rapidamente…

esse método é executado varias e varias vezes, uma vez para cada linha de um arquivo texto lido, sendo que essa linha é lida em outro lugar e jogada na variavel global linhaLida, do tipo String (é usado bufferedReader para ler o arquivo)

bem…a ideia aqui é gerar um arquivo .html contendo tabelas, com dados vindos de um outro arquivo… a variavel global do tipo String chamada html vai recebendo o código fonte do .html e depois é escrito tudo de uma vez só…

alguem ai tem alguma dica de como diminuir o uso da CPU??? (não me importo em fazer ele de modo que rode no dobro do tempo)

public void insereTabela(ArrayList<Entrada> layout)
            throws java.io.IOException, NullPointerException{
        try{   Thread.sleep(30);
        }catch(InterruptedException ie){}        
        
        html += "vou adicionando na var html o codigo fonte";
        
        try{   Thread.sleep(30);
        }catch(InterruptedException ie){} 
        
        html += "vou adicionando na var html o codigo fonte";
        
        
        try{   Thread.sleep(30);
        }catch(InterruptedException ie){} 
        
        for(int j = 0;j<layout.size();j++){

            try{   Thread.sleep(30);
            }catch(InterruptedException ie){} {}

            int tamanho = layout.get(j).getFim()-layout.get(j).getInicio()+1;

            html += "vou adicionando na var html o codigo fonte";



            try{   Thread.sleep(30);
            }catch(InterruptedException ie){} 
            
            if (tamanho > 32){
                String conteudo = "";
                int k = layout.get(j).getInicio()-1;
                do{

                    try{   Thread.sleep(30);
                    }catch(InterruptedException ie){} 

                    if (k+30<layout.get(j).getFim())
                        conteudo += linhaLida.substring(k, k+30)+"&gt;<br>";
                    else
                        conteudo += linhaLida.substring(k, layout.get(j).getFim())+"<br>";
                    k +=30;
                    
                }while(k&lt;layout.get(j).getFim());


                html += "\t\t\t"+"&gt;&lt;td align=\"center\" width=35%&gt;&lt;pre&gt;"+conteudo+"&lt;/pre&gt;&lt;/td&gt;"+System.getProperty ("line.separator")+"\t\t&lt;/tr&gt;";
                
                try{   Thread.sleep(30);
                }catch(InterruptedException ie){} 
                
            }else{

                try{   Thread.sleep(30);
                }catch(InterruptedException ie){} 

                String conteudo = linhaLida.substring(layout.get(j).getInicio()-1, layout.get(j).getFim());
                html += "\t\t\t"+"&lt;td align=\"center\" width=35%&gt;&lt;pre&gt;"+conteudo+"&lt;/pre&gt;&lt;/td&gt;"+System.getProperty ("line.separator")+"\t\t&lt;/tr&gt;";

            }
        }
        html += "\t\t&lt;/table&gt;"+System.getProperty ("line.separator");
        
        try{   Thread.sleep(30);
        }catch(InterruptedException ie){} 
    }

o metodo que chama esse metodo diversas vezes é esse:

[code]
public void geraSaidaCorpo()throws java.io.IOException{
int i = 1;

    while((linhaLida = remessaLida.readLine()) != null){
        System.out.println(i);
        html += System.getProperty ("line.separator")+System.getProperty ("line.separator");
        html +="\t\t<br><br><br>&lt;center&gt;<font size = 10><b>Linha "+i+"</b></font>&lt;/center&gt;<br><br>"+System.getProperty ("line.separator");
        boolean acabou = false;
        int j, k;
        
        ArrayList&lt;Entrada&gt; e = null;
        for (j = 0;j&lt; layoutsCorpo.size();j++){
            if (layoutsCorpo.get(j).get(0).getTipo().equals(linhaLida.substring(0, 1))){
                e = layoutsCorpo.get(j);
                break;
            }else{
                for (k=0;k&lt;layoutsFim.size();k++){
                    if(layoutsFim.get(k).get(0).getTipo().equals(linhaLida.substring(0, 1))){
                        e = layoutsFim.get(k);
                        acabou = true;
                        break;
                    }
                }
            }    
        }
        
        if (e == null)
            javax.swing.JOptionPane.showMessageDialog(null, "não existe nenhum layout do tipo da linha "+i);
        else
            insereTabela(e);
        
        AmbienteGrafico.JanelaPrincipal.metodo();
        if (acabou)
            break;
        
        i++;
    }
    
    
}

[/code]>

pessoal… obrigadão pelas ajudas…

Tente diminuir a alocação de objetos ao máximo.

Use StringBuilder ao invés de concatenação de Strings.

Carregue seus System.getProperty em variáveis, assim faz a leitura apenas uma vez.

Tente isso, ja vai dar uma boa diferença.

Tem que verificar também a possibilidade de estar ocorrendo Memory Leak. Você utiliza sempre a mesma instância para ler o arquivo??
se não, você fecha todos os inputstreams, readers??

da uma olhada nisso…

Fernando Rosa

Agora que eu notei.

 throws NullPointerException

Isso me cheira a gambiarra das fortes…

puxa…vlw mesmo nblues…

axo q isso vai diminuir bastante a quantidade de memoria usada, achei interessante isso das StringBuilder… eu intendi isso lendo esse tópico:

http://www.guj.com.br/posts/list/54259.java

mais eu ainda tenho uma duvida a respeito dessa classe, veja osdois códigos:

[code]StringBuilder codigo = new StringBuilder();

codigo.append(“1”+“2”+“3”);[/code]

[code]StringBuilder codigo = new StringBuilder();

codigo.append(“1”);
codigo.append(“2”);
codigo.append(“3”);[/code]

da diferença de velocidade fazer como no primeiro bloco de código ai e o ideal é fazer como no segundo, ou tanto faz???

tem algum programa simples que mostre o tempo de execução de uma classe/metodo/instrução/algo do tipo que vc possa me indicar??

a respeito do getProperty eu coloquei em uma variavel e mandei adicionar a variavel…acredito que isso resolva…

obrigadão…

Fernando, eu não muito que esta ocorrendo vazamento de memoria por causa do Garbage Colector do java… mais eu to dndo close() tanto no meu BufferedReader quando no BufferedWriter…

mais obrigado assim mesmo pela ajuda…

Faça como no segundo exemplo.

Nem precisa tanto, faça um mini-benchmark no seu ambiente com um método main e repetições.
Na maioria dos casos isso ja vai te dar uma idéia de quão melhor/pior pode estar.

É, a principio é isso.

[quote=nbluis]Agora que eu notei.

 throws NullPointerException

Isso me cheira a gambiarra das fortes…
[/quote]

No ambiente grafico deve-se selecionar um arquivo xml contendo as regras de onde estão os dados da tabela sendo gerada, o começo e o fim do campo na linha lida (que eu vo fazer substring), o nome do campo, coisa q vai fica em outra celula na tabela, coisas do tipo…

esse programa tem um recurso para criar um layout (um arquivo .xml contendo eses parametros), mais eu tenho receio do kra tenta aponta para um arquivo inexistente, ou um xml criado por ele mesmo e que esteja errado (ai daria null pointer quando fosse tentar acessar certas tags desse xml)…

em outras palavras estou garantindo que não vai da um problema caso o usuario do programa tente fazer alguma coisa errada… o null pointer que tenho receio de acontecer não é bem culpa do código em si…

kralho…

fiz o que vc falou dos getProperty e usei StringBuilder, um processamento de 18 minutos aconteceu em coisa de 1 segundo… e sem grande uso de CPU… (nesse tempo podia até usa 100 %…nem ia da problema…)

mto interessante essa classe StringBuilder ai…me ajudo mto…

brigadão a kem me ajudo… valeuzão ai nbluis…