Execução adiada e avaliação lenta (LINQ to XML)

As operações de consulta e eixo são geralmente implementadas para usar a execução adiada. Este artigo explica os requisitos e as vantagens da execução adiada, além de algumas considerações sobre a implementação.

Execução adiada

A execução adiada significa que a avaliação de uma expressão será atrasada até que seu valor realizado seja realmente necessário. A execução adiada pode aumentar muito o desempenho quando você precisa manipular grandes coleções de dados, especialmente em programas que contêm uma série de consultas ou manipulações encadeadas. Na melhor das hipóteses, a execução adiada permite apenas uma única iteração pela coleção de origem.

As tecnologias LINQ usam de modo intenso a execução adiada em ambos os membros das classes System.Linq centrais e nos métodos de extensão nos diversos namespaces LINQ, como System.Xml.Linq.Extensions.

Há suporte direto para execução adiada na linguagem C# pela palavra-chave yield (C# Reference) (na forma da instrução yield-return) quando usada dentro de um bloco do iterador. Tal iterador deve retornar uma coleção do tipo IEnumerator ou IEnumerator<T> (ou um tipo derivado).

Avaliação adiantada versus lenta

Quando você escreve um método que implementa a execução adiada, também precisa decidir se deve implementar o método usando a avaliação lenta ou a avaliação ansiosa.

  • Na avaliação lenta, um único elemento da coleção de origem é processado durante cada chamada ao iterador. Essa é a forma comum de implementação de iteradores.
  • Na avaliação adiantada, a primeira chamada ao iterador resultará no processamento da coleção inteira. Uma cópia temporária da coleção de origem também pode ser necessária. Por exemplo, o método OrderBy precisa classificar toda a coleção antes de retornar o primeiro elemento.

A avaliação lenta normalmente gera um melhor desempenho porque distribui a sobrecarga de processamento uniformemente por toda a avaliação da coleção e minimiza o uso de dados temporários. Naturalmente, para algumas operações, não há nenhuma outra opção que não seja materializar resultados intermediários.

Confira Exemplo de execução adiada para obter um exemplo de execução adiada de programação em C# e Visual Basic.

Confira também