1
resposta

Redução do tempo de remoção dos itens da lista reduzida para 0 usando while

Oi Pessoal, após realizar o curso de relacionamentos de coleções fui ver o teste que professor disse que estaria nos exercícios e realizando algumas modificações no código por curiosidade, nessas mudanças eu troquei o for por while e notei que existe uma leve alteração na performance na inserção e na remoção se torna instantâneo para a array, que antes levava alguns milisegundos

package br.com.alura.testes;

import java.util.*;

public class TestaPerformance {

    public static void main(String[] args) {

        System.out.println("**** ArrayList vs LinkedList ***");

        List<Integer> numerosArrayList = new ArrayList<>();
        List<Integer> numerosLinkedList = new LinkedList<>();
        int quantidadeElementos = 1000000;

        long tempoArrayList  = insereElementosNo(numerosArrayList, quantidadeElementos);
        long tempoLinkedList = insereElementosNo(numerosLinkedList, quantidadeElementos);

        System.out.println("Inserção na ArrayList demorou  " + tempoArrayList);
        System.out.println("Inserção na LinkedList demorou " + tempoLinkedList);

        tempoArrayList = removePrimeirosElementos(numerosArrayList);
        tempoLinkedList = removePrimeirosElementos(numerosLinkedList);

        System.out.println("Remoção da ArrayList demorou  " + tempoArrayList);
        System.out.println("Remoção da LinkedList demorou " + tempoLinkedList);
    }

    /*
     * removendo 100 elementos sempre na primeira posição
     */
    private static long removePrimeirosElementos(List<Integer> numeros) {
        long ini = System.currentTimeMillis();

/*          while (numeros.isEmpty())
*               numeros.remove(0);
*/
        for (int i = 0; i < 100; i++) {
            numeros.remove(0);
            //removendo sempre o primeiro elemento
        }
        long fim = System.currentTimeMillis();
        return fim-ini;
    }

    private static long insereElementosNo(List<Integer> numeros, int quantidade) {
        long ini = System.currentTimeMillis();

/*         int i = 0;
  *       while ( i < quantidade){
  *             numeros.add(0);
  *              i++;
 */            }
        for (int i = 0; i < quantidade; i++) {
            numeros.add(i);
            }
        long fim = System.currentTimeMillis();
        return fim-ini;
    }

}

resultado com for: ** ArrayList vs LinkedList **

Inserção na ArrayList demorou 31

Inserção na LinkedList demorou 256

Remoção da ArrayList demorou 88

Remoção da LinkedList demorou 0

Resultado com while: ** ArrayList vs LinkedList **

Inserção na ArrayList demorou 22

Inserção na LinkedList demorou 283

Remoção da ArrayList demorou 0

Remoção da LinkedList demorou 0

1 resposta

Oi Andre,

Sobre a performance entre os laços while e for, poderíamos analisar friamente que o for, por contar variáveis, instanciação da mesma e alteração do seu valor, ele poderia ser mais lento que um while, por ser somente uma comparativa.

No entanto, acredito que no final a JVM é tão performática em algoritmo simples que seria irrisório. Talvez no seu caso poderia ser algum cache de memória ou da própria IDE para dar essa diferença no resultado.

Aqui temos um artigo simples que compara os tipos de laços, e final, entre os dois mencionados, não há diferença: https://mkyong.com/java/while-loop-for-loop-and-iterator-performance-test-java/