Performance com C# – Coleções

Fala aí galera!

Continuando a série de posts sobre performance, hoje vou falar um pouco sobre coleções. Saber o tipo mais adequado de coleção para usar em cada situação é bastante importante, e são nesses pequenos detalhes que a sua aplicação fica mais performática.

Coleções

Em primeiro lugar, acho necessário deixar claro que coleções de elementos armazenados em um array são mais performáticas do que qualquer coleção que provém de System.Collections ou de System.Collections.Generic. Mas vou falar mais detalhadamente sobre arrays em um próximo post.

O primeiro passo para escolhermos uma boa coleção é saber o tipo de função que ela vai desempenhar no nosso código. E logo após devemos escolher o tipo de dados que essa coleção vai armazenar. E aliás, a escolha do tipo de dados é quase tão importante quanto o tipo de coleção, isso foi provado no post anterior sobre Conversões. Um exemplo disso é que uma lista do tipo int com vinte milhões de itens é armazenada com 76MB de memória, já uma lista com a mesma capacidade, mas do tipo decimal precisa de 161MB.

Então, sabendo o que eu preciso fazer com a minha coleção, basta escolher seguindo alguns critérios:

Você realmente precisa de uma coleção?
Para precisarmos realmente de uma coleção, pelo menos um dos itens abaixo deve ser correspondido:

  • O número de elementos é desconhecido, ou não fixado em tempo de compilação;
  • Você precisa dar suporte à iteração sobre todos os elementos;
  • Você precisa dar suporte à ordenação dos elementos;
  • Expor os elementos em que o consumidor espera um tipo específico dessa coleção;

Com esses critérios atendidos, vamos começar

Escolha sempre a versão genérica.
Para evitar conversões desnecessárias, procure utilizar a versão genérica, elas foram introduzidas desde a versão 2.0 do .NET Framework; por exemplo, usar um Dictionary<TKey, TValue> é mais performático do que um Hashtable, também como um List<T> é mais rápido do que um ArrayList.

Você precisa de uma lista ordenada?
O melhor método de ordenar uma lista, é usando o método Sort da classe List<T>, ou se estiver usando uma classe que utiliza chave e valor, a melhor maneira é utilizar a classe SortedList<TKey, TValue>, como no exemplo:

Listas Ordenadas

Você precisa armazenar elementos com chave e valor?
Para manipular pares de chave e valor, prefira usar a classe Dictionary<TKey, TValue> provavelmente é a classe associativa mais utilizada visto que é extremamente rápido executar tarefas de busca, inclusão e exclusão, essas operações por sua vez consomem um tempo constante amortizado, ou seja, não importa a quantidade de itens no seu Dictionary que a velocidade da operação se manterá constante.

Você precisa acessar elementos pelo índice?
Simples, utilize Arrays, é maneira mais eficaz e performática de se acessar um elemento por índice, ou ainda pode utilizar a classe List<T> que já foi supracitada.

Para ficar bem claro!
A imagem a seguir ilustra claramente sobre as coleções e o que há de diferente entre elas:
Coleções

Uma dica bem legal, é que sempre que pudermos definir o tamanho de nossa lista, vai poupar um grande esforço da aplicação, parece bobeira, mas influencia na maneira em que ela vai reagir com a manipulação, o resultado abaixo foi obtido com uma lista de 50 milhões de itens:

Os exemplos deste código e dos outros códigos desta série de posts sobre performance estão disponíveis no GitHub: https://github.com/vmussak/PerformanceExample

Por hoje é só isso, qualquer dúvida ou sugestão, estou à disposição! Até mais 😀

Referências:
http://www.macoratti.net/12/12/c_col1.htm
LOTAR, Alfredo. Como melhorar a performance de websites .NET.

Advertisement

2 thoughts on “Performance com C# – Coleções

  1. Rafael Pessoni 27/04/2015 / 23:28

    Muito interessante, meus parabéns!

    Gostar

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão /  Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão /  Alterar )

Connecting to %s