CSharp Performance com o Yield
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.