CSharp Performance com o Yield

Marcos Lima
2 min readJan 12, 2024

--

Se você vai trabalhar com iteradores no CSharp, o uso doYield pode ser uma boa escolha. O Yield pode ser utilizado de duas maneiras, quando utilizado com o return, fornece um valor, e quando usado com break, sinaliza o fim da iteração.

Um iterador pode ser usado para percorrer coleções, como listas e matrizes.

Simplicidade no código: Ao criar uma coleção que precisa ser iterada, o Yield pode simplificar seu código, pois ele abstrai a necessidade de criar e gerenciar uma coleção.
Eficiência no uso da memória: O Yield pode diminuir consideravelmente o uso da memória, especialmente ao lidar com grande conjunto de dados, pois ele não exige que toda coleção seja mantida em memória.

Agora vamos para parte prática. Vamos fazer a iteração em uma lista gigante com e sem o uso do Yield. Nesse primeiro momento vamos para o exemplo sem o uso do Yield:

public static IEnumerable<int> NotUseYield() 
{
var list = new List<int>();
for (int i = 0; i < 100000000; i++)
list.Add(i);

return list;
}

Observe que para iterar em nossa lista, levamos 288MS, tivemos 6 acionamentos do Gen0, 6 do Gen1 e 6 do Gen2 e consumimos 671 MB de memória.

Agora nosso exemplo utilizando o yield:

public static IEnumerable<int> UseYield() 
{
for (int i = 0; i < 100000000; i++)
yield return i;
}

Observe que na mesma iteração os resultados são completamente diferentes. iteramos em nossa lista, em um intervalo de 0MS, sem nenhum acionamento do Garbage Collection e isso é refletido no consumo de memória utilizada, nesse caso 30MB.

Podemos finalizar concluindo que o uso do yield para iterar em coleções grandes pode trazer um ganho considerável de performance, economia no consumo de memória e simplicidade no código.

Esse exemplo está disponível no GitHub:

Caso achem interessante, peço por favor uma ⭐️ no repositório apoiando. Fica também o convite para vocês me seguirem no GitHub.

--

--

Marcos Lima
Marcos Lima

Written by Marcos Lima

.NET lover. Passionate about Software Architecture. Learning every day.

No responses yet