Performance WHILE X FOR - Qual o mais rápido?

6 respostas
kapa01
Fiz uma pesquisa para tentar descobrir quais das duas estruturas de repetição é a mais rápida e quando é melhor usar o while e quando é melhor usar o for. O while é melhor utilizado quando você não sabe quantas vezes ele vai ser executado (dá para fazer com o for também), e o for é ideial quando se precisa de um contador (também é possível usando o while). Resolvi então fazer um comparativo entre o while e o for em termos de performance e cheguei ao seguinte resultado: o for é sempre mais rápido quando concatena String.
public class TesteString {

    static int fim = 12000;

    public static void main(String[] args) {
        System.out.println("-------String---------");
        long time = -System.currentTimeMillis();
        stringFor();
        time += System.currentTimeMillis();
        System.out.println("For: " + ((double) time / 600));
        time = -System.currentTimeMillis();
        stringWhile();
        time += System.currentTimeMillis();
        System.out.println("While: " + ((double) time / 600));
    }

    public static void stringFor() {
        String texto = "";
        for (int i = 0; i < fim; i++) {
            texto += "Java";
        }
    }

    public static void stringWhile() {
        String texto = "";
        int i = 0;
        while (i < fim) {
            texto += "Java";
            i++;
        }
    }
}
e o while é sempre mais rápido quando se concatena StringBuffer.
public class TesteStringBuffer {
    static int fim = 4000000;

    public static void main(String[] args) {
     stringBuffer();
    }
    public static void stringBuffer() {
        System.out.println("-------StringBuffer---------");
        long time = -System.currentTimeMillis();
        stringBufferFor();
        time += System.currentTimeMillis();
        System.out.println("For: " + time);
        time = -System.currentTimeMillis();
        stringBufferWhile();
        time += System.currentTimeMillis();
        System.out.println("While: " + time);
    }

    public static void stringBufferFor() {
        StringBuffer texto = new StringBuffer("");
        for (int i = 0; i < fim; i++) {
            texto.append("Java");
        }
    }

    public static void stringBufferWhile() {
        StringBuffer texto = new StringBuffer("");
        int i = 0;
        while (i < fim) {
            texto.append("Java");
            i++;
        }
    }

}
Por que isso acontece? alguém pode me dizer? Obrigado.

6 Respostas

E

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

Note: não é o uso do for que deixa mais lento. É o uso da concatenação de strings com “+=”, que é super-lenta.

rogelgarcia

Na minha máquina…

No primeiro teste, o [color=darkblue]for [/color]foi mais lento… por uma diferença muito pequena (e as vezes o [color=darkblue]while [/color]foi mais lento)
Troquei a ordem do teste, passando a testar o [color=darkblue]while[/color] primeiro, as vezes o [color=darkblue]for [/color]era mais lento, as vezes o [color=darkblue]while[/color]…

E é provavel que a diferença se deu pior para o primeiro loop testado, pela realocaçao de memória necessária para satisfazer tantas concatenações…

O segundo teste deu empate…

Conclusao … é tudo a mesma coisa…

A máquina virtual poderá otimizar alguns códigos, então… faça o código mais elegante e legível…

Andre_Brito

Como disse o entagl., é a concatenação de objetos String. É lento, serio… tente concatenar alguns milhões de cadeias que você vai ver a diferença entre String e StringBuilder (ou Buffer).
Já ouvi até relatos de gente dizendo que resolveu problemas em empresas trocando Strings por StringBuilders e / ou byte (quando, no caso, ocorrem comparações usando números dentro das strings).

kapa01

A intenção é ver qual tem o melhor desempenho (While X For).
A concatenação de String eu já sabia que era mais lenta, coloquei para dar para ver o tempo de execução.
Pelo que eu vi não existe muita diferença entre usar o while e o for, mas quando usar o while? e o for?

rogelgarcia

Use o que proporcionar o código mais legível…

L

Nunca se preocupe com desempenho quando for codificar; a maioria das máquinas hoje conseguem resolver uma infinidade de problemas num tempo suficientemente bom.

E quando, num raro dia, houver REALMENTE um problema de desempenho, pode ter certeza que não vai ser a troca de for pra while que vai resolver. Aliás, qualquer alteração “brainless” que você possa imaginar, que poderia resultar em execução mais rápida, já é feito pelo compilador e pelo JIT.

Com relação à utilização, vejo o pessoal usando muito mais for do que while. Acho que a razão é que a estrutura do for não te deixa esquecer de colocar incremento e condições de parada.

Criado 26 de abril de 2010
Ultima resposta 5 de jun. de 2010
Respostas 6
Participantes 5