Aumentando a Performance com o C# Yield

Olá pessoal,
Está é uma dica pra você que quer performance na execução de seus programas, uma sitaxe enxuta e simples.
Antes de apresentar alguns exemplos vamos entender um pouco mais da definição do Yield.
A palavra-chave yield sinaliza ao compilador que o método em que ele aparece é um bloco iterator. O compilador gera uma classe para implementar o comportamento que é expresso no bloco iterador. No bloco iterador, a palavra-chave yield é usada junto com a palavra-chave return para fornecer um valor para o objeto enumerador. Esse é o valor retornado, por exemplo, em cada loop de uma intrução foreach. A palavra-chave yield também é usada com break para sinalizar o final da iteração.
Para obter mais informações sobre os iteradores, consulte Iteradores (C# Programming Guide).

Exemplo de utilização:

Em uma instrução yield return, a expressão é avaliada e retornada como um valor para o objeto enumerador; a expressão deve ser implicitamente conversível para o tipo de yield do iterador.
Em uma instrução yield break, o controle é incondicionalmente retornado ao “chamador” do iterador, que é o método IEnumerator.MoveNext (ou seu genérico System.Collections.Generic.IEnumerable(Of T) contraparte) ou o método Dispose do objeto enumerador.
A instrução yield apenas pode aparecer dentro de um bloco iterador, que pode ser implementado como o corpo do método, operador ou o acessador. O corpo de tais métodos, operadores ou acessadores é controlado pelas seguintes restrições:

  • Blocos não seguros não são permitidos.
  • Parâmetros para o método, operador ou assessor não podem ser ref ou out.
  • Uma instrução yield return não pode ser utilizada em qualquer lugar dentro de um bloco try-catch.
  • Pode ser utilizada em um bloco try se o bloco try é seguido por um bloco finally.
  • Uma instrução yield break pode ser utilizada em um bloco catch ou de um bloco try, mas não um bloco finally.
  • A instrução yield não pode aparecer em um método anônimo. Para obter mais informações, consulte Métodos anônimos (Guia de programação do C#).

Para mais informações a respeito do yield visite o MSDN.

Até o momento fizemos nossa lição de casa e por consequencia aprendemos a nossa boa e velha teoria.
Teoria boa é aquela que colocamos em prática. Portanto, agora vamos fazer uma comparação.

Criando um método para retornar um lista com inteiros, repare no processo instanciamos uma lista e vamos adicionado o nosso valor a esta lista e ao final retornamos esta lista.

Agora vamos usar o C# yield, repare que não é necessário instanciar a lista e a sintaxe fica muito mais simples.

Até o momento visualmente falando os métodos são iguais e fazem a mesma coisa. Mas qual deles é o melhor?
O que você faria para verificar? Instanciar uma variavel de tempo e contar o tempo antes e ao final da execução dos métodos?
É um bom teste, mas se a execução for tão rapida que não de para ver a diferença?
Neste caso usaremos o System.Diagnostics para nos auxiliar, especificamente utilizaremos a classe Stopwatch.

Ok! Faça o debug ai em sua máquina e verifique o quão rápido é o método que utiliza o Yield.

Apenas pra ilustrar este post pra mim o elapsedTicks1 deu 437031 e o elapsedTicks2 deu 1158.

 

Obrigado por ler este post.
Curta e compartilhe se se você gostou!

Gostaria de ver a versão inglesa deste post?
Clique na bandeira inglesa -> United-Kingdom

Post navigation

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *

 
Translate »