[RESOLVIDO] Performace de Collections.sort() num LinkedList ou ArrayList

Boa tarde pessoal!

Estou com uma dúvida em relação ao uso de Collections.sort() e vou perguntar, pra ajudar a espalhar conhecimento:

Existe diferença de desempenho entre um LinkedList e um ArrayList qando eu uso Collections.sort() com uma comparação simples? Um é mais rápido que o outro ou dá na mesma?

Já agradeço as respostas :slight_smile:
Abraços

[quote=alineea]Boa tarde pessoal!

Estou com uma dúvida em relação ao uso de Collections.sort() e vou perguntar, pra ajudar a espalhar conhecimento:

Existe diferença de desempenho entre um LinkedList e um ArrayList qando eu uso Collections.sort() com uma comparação simples? Um é mais rápido que o outro ou dá na mesma?

Já agradeço as respostas :slight_smile:
Abraços[/quote]

Você pode responder essa pergunta e postar aqui os benchmarks usando StopWatch para medir.

StopWatch st = new StopWatch(); List array = getArray(1000); List linked = getLinked(1000); st.start(); Collections.sort(array); st.stop(); sysout(st.toString()); st.reset(); st.start() Collections.sort(linked); st.stop(); sysout(st.toString());

Um linkedList pode ser mais lento do que ArrayList no que diz respeito a iteração. Porém será uma boa opção para inserções e exclusões rápidas.

Kkk burrona neh dreampeppers99! Um benchmark, por que não? :slight_smile:
Eu vou testar quando chegar em casa e falo pra vcs.

Então, Mr.style … Eu preferia linkedlist porque preciso implementar uma fila, mas antes vou ter que ordená-la. Por isso surgiu a dúvida :wink:

Uma LinkedList se baseia em referências e não em posições fixas para fazer inserções e exclusões, mas tem a desvantagem da ordenação (fator em que o arraylist leva vantagem).

Se seu sistema deve fazer muitas buscas e poucos modificações na lista, recomendo o uso de arraylist.
Uma busca binária com um arrayList pode chegar a complexidade excelente de O(lg n)

Pois é… No meu caso, eu só vou inserir no final e pegar do começo, fila mesmo. O que me quebra é que tenho que ordenar a fila primeiro. E eu me preocupo com a performace porque os objetos que vou receber são mais pesados e o tempo de resposta é o que mais interessa na funcionalidade.

Eu pensei em inserir eles de uma vez num ArrayList, ordenar com comparator e depois criar uma linkedList com o resultado, tipo

List listaOrdenada = new ArrayList(); ... // aqui inseri meus objetos e ordenei com o Comparator.sort() List fila = new LinkedList(listaOrdenada); ... // agora é so push e pop pra processar

Eu vou testar em casa pra ver se compensa.

Posso estar falando bobagem, mas acredito no caso do seu projeto um ArrayList é suficiente e ótimo…

Porque pelo que vc falou vai ter busca e inserção no fim, inserção no fim de um arraylist é O(1) .

Não vejo o porque dá criação da linkedlist

Abraços

Só mais uma dúvida você vai tirar o primeiro elemento da fila?

Sim. Tenho elementos que trabalham com arquivos de texto e:

  • preciso ordenar pelo tamanho do arquivo
  • para o processamento, vou retirar do começo

Entendi, mas pelo visto você vai ordernar uma única vez, certo ?
Ou cada vez que um elemento for inserido será ordenado novamente?
Se for ordenar uma única vez eu usaria tudo como uma linkedList, não sei qual o custo e nem se é possivel criar uma nova LinkedList desta maneira que vc está criando…
Mas é melhor esperar um membro mais velho responder, eu ainda estou aprendendo =P

Isso mesmo EduardoPinto. Eu vou inserir os elementos, ordenar uma única vez e consumi-los como numa fila.

Cheguei em casa e fiz um benchmark, como o colega recomendou. Usei uma linkedlist, uma arraylist e uma combinação (arraylist para ordenar, cria linkedlist com esta arraylist e consome o linkedlist)
O resultado foi:

  • para poucos elementos deu na mesma
  • para muitos elementos:
    – para ordenar a arraylist é mais rápida em centenas de milissegundos.
    – para consumir como uma fila o linkedlist é muuuuito mais rápido que o arraylist (isso eu ja sei porquê rs)

E outra: os testes deram melhor resultado quando eu usei a combinação. Interessante ^^…

Enfim, respondendo a pergunta deste tópico, a arraylist é mais rápida, mas não chega a ser tanto que a linkedlist também não possa ser usada, dependendo do caso.

O ruim é que os objetos que eu vou usar possuem atributo File com arquivos de 10MB pra cima, então eu não sei se os testes que fiz vão ser válidos pra mim, já que vou trabalhar com poucos objetos, porém pesados que ocuparão memória. Mas dá pra ter uma base, vou fazer outros testes.

Mas, esquecendo todo meu contexto e voltando à minha simples pergunta, acho que tá respondido! :smiley:

Estou postando em anexo os códigos que usei pra fazer o teste e exemplos de saida do programa.
Muito obrigada a todos!:smiley:

TESTE 1
Início do teste de performance as Fri Apr 29 23:41:32 CLT 2011

----- Populando as filas -------
----- Filas já populadas com 100000 elementos -------

----- Ordenando as filas -------
Tempo de ordenacao da linkedList: 141ms
Tempo de ordenacao da arrayListTemp + criação da linkedListDeArrayListOrdenada: 109ms
Tempo de ordenacao da arrayList: 156ms
----- Filas já ordenadas -------

----- Consumindo as filas -------
Tempo de consumo da linkedList: 15ms
Tempo de consumo da linkedList de arrayList: 0ms
Tempo de consumo da arrayList: 5882ms
----- Filas já consumidas -------

TOTAL DE TEMPO ORDENACAO+CONSUMO DE LinkedList : 156ms
TOTAL DE TEMPO ORDENACAO+CONSUMO DE LinkedList(ArrayListOrdenada) : 109ms
TOTAL DE TEMPO ORDENACAO+CONSUMO DE ArrayList : 6038ms

Fim do teste de performance as Fri Apr 29 23:41:39 CLT 2011

TESTE 2
Início do teste de performance as Fri Apr 29 23:17:51 CLT 2011

----- Populando as filas -------
----- Filas já populadas com 1000000 elementos -------

----- Ordenando as filas -------
Tempo de ordenacao da linkedList: 1904ms
Tempo de ordenacao da arrayListTemp + criação da linkedListDeArrayListOrdenada: 1764ms
Tempo de ordenacao da arrayList: 1733ms
----- Filas já ordenadas -------

----- Consumindo as filas -------
Tempo de consumo da linkedList: 79ms
Tempo de consumo da linkedList de arrayList: 31ms

===> já são 23:39 e eu desisti de esperar a resposta!!!