C# - Usando o método EnsureCapacity com Lists, Queues e Stacks
Hoje veremos o novo recurso EnsureCapacity que foi introduzido no C# 10 e foi adicionado às coleções List, Queue e Stack. |
O método EnsureCapacity foi introduzido no C# 10 nas coleções List, Queue, Stack.
Antes de realizar
um grande conjunto de inserções em um Dictionary ou
HashSet, é útil chamar o EnsureCapacity com
o tamanho de coleção esperado. Isso permite que a coleção execute uma operação
de redimensionamento antecipadamente, evitando a possibilidade de vários
redimensionamentos serem necessários.
O método EnsureCapacity agora também foi adicionado
às classes List<T>, Stack<T> e Queue<T> para que
essas coleção também possam obter o benefício de desempenho.
A exceção é a a classe
Collection<T> que pode opcionalmente
encapsular outra coleção que pode não necessariamente expor um método
EnsureCapacity . Como uma subclasse de
Collection<T>, ObservableCollection<T>
também não pode expor este método . Esta não é a única falha em Collection<T> e ObservableCollection<T>. A falta de um método AddRange incomoda os desenvolvedores há muito tempo. |
Vamos começar entendendo porque e quanto usar este método.
Internamente, uma matriz é usada pelas coleções List, Queue e Stack. Cada vez que adicionamos mais itens a essas coleções, precisamos aumentar o tamanho desse array interno. Portanto, há uma operação de redimensionamento que ocorre, e, isso é um impacto no desempenho, pois o array está mudando de tamanho.
Em uma situação em que sabemos o tamanho máximo dessa matriz ou digamos que sabemos o máximo de elementos que serão armazenados em nossa coleção List, Queue ou Stack, podemos predefinir o tamanho usando o método EnsureCapacity.
Isso garantirá que esse tamanho seja definido inicialmente e que não haja redimensionamento do array interno e, portanto, obteremos um aumento de desempenho.
Vejamos um exemplo de código usando um projeto Console (.NET Core) chamado CShp_EnsureCapacity criado no VS 2019.
Resultado:
O código acima esta usando o recurso Top Level Statements.
Portanto, vemos que mesmo que excedamos a capacidade definida no método EnsureCapacity, ainda podemos continuar adicionando elementos à nossa lista.
No entanto, neste ponto, o array interno voltará a ser redimensionado, e, perdemos o ganho de desempenho.
Isso indica que devemos ter muito cuidado ao definir o valor EnsureCapacity.
E estamos conversados...
"E tu, ó menino,
serás chamado profeta do Altíssimo, Porque hás de ir ante a face do Senhor, a
preparar os seus caminhos; Para dar ao seu povo conhecimento da salvação, Na
remissão dos seus pecados;"
Lucas 1:76,77
Referências:
C# - Lendo e escrevendo em arquivos textos e binários
C# - Entendo o I/O na plataforma .NET
C# - Fluxo assíncrono ou async streams
C#- Apresentando Streams assíncronos