Performance com Yield Return
Sabe aquele Yield return que está no código fonte do Linq que você achou interessante mas nunca utilizou? Pois bem, economiza memória, é mais performático e clean.
Os dois códigos abaixo fazem a mesma coisa, recebem um range gigante de números e retornam um IEnumerable de números pares:
Sem Yield return
Com Yield return
Veja agora o impacto no consumo de memória!
Utilizando yield return são consumidos apenas 2,82Mb enquanto o retorno sem o yield return consumiu incríveis 3,4Gb!
Observe que como o yield return é uma máquina de estado, o seu tempo de execução é maior (19s com yield e 16s sem yield).
O Yield return é um sintaxe sugar para controlar um fluxo de dados. Quando yield return é compilado, ele é transformado em uma máquina de estado, que permite controlar o fluxo de dados, retornando elementos sem sair do método. Ao invés de adicionarmos elementos em uma lista que é retornada posteriormente, retornamos elementos em sequência.
Na prática, apenas um elemento pode ser retornado, porém, nesse cenário, é um overhead, por isso o uso do yield return é recomendado para grande quantidade de elementos.