Partilhar via


Execução adiada e avaliação lenta em LINQ to XML

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

Execução Adiada

Execução adiada significa que a avaliação de uma expressão é 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 Extensions.

A execução adiada tem suporte direto na linguagem C# pela palavra-chave yield (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 (ou um tipo derivado). Não há nenhum equivalente à palavra-chave yield no Visual Basic 9.0, portanto é mais complicado implementar a execução adiada nessa linguagem.

Avaliação ansiosa vs.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 ansiosa, a primeira chamada ao iterador resultará na coleção inteira que está sendo processada. 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.

Próximas Etapas

O próximo tópico deste tutorial ilustra a execução adiada:

Consulte também

Referência

yield (Referência de C#)

Conceitos

Tutorial: Encadeamento consulta juntamente

Conceitos e a terminologia (transformação funcional)

Operações de agregação