[Groovy] Diferença de desempenho entre unique() e toSet().toList()

Updated . Posted . Visible to the public.

Teste prático da diferença de desempenho

int qtdTeste = 20_000
Date inicio
Date fim
List<String> x = []
for (int i = 0; i < qtdTeste; i++) { x.add(i) }

inicio = new Date()
x.toSet().toList() // 9 ms!
fim = new Date()
println "${fim.time - inicio.time} ms"

inicio = new Date()
x.unique() // 10765 ms!
fim = new Date()
println "${fim.time - inicio.time} ms"

Mas atenção às diferença de comportamentos :

Diferença 1

List lista = [1.0, 1f, 1l, 1, 1.0000]

println( lista.toSet().toList() )
// Devolve [1.0, 1.0000, 1, 1, 1.0]
// Utiliza hashCode() para agrupar os objetos, e depois usa o equals() apenas dentro de cada grupo
// É parte do que o torna rápido

println( lista.unique() )
// Devolve [1.0]
// Utiliza equals() entre todos objetos
// É parte do que o torna lento

Portanto antes de fazer a "troca cega" de unique() para toSet().toList() analise o comportamento esperado para seus objetos!
Pois pode ser necessário ajustar a sua implementação de equals() e hashCode()!

Diferença 2
A implementação de unique() mantem a ordenação da lista original.
toSet().toList() não estabelece nenhum contrato em relação à ordem final dos elementos que serão devolvidos.

Bruno Vieira
Last edit
Bruno Vieira
Posted by Bruno Vieira to ZeroGlosa (2017-06-12 12:22)