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:


José Carlos Macoratti