Compartilhar via


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 e algumas considerações de implementação.

Execução adiada

A execução adiada significa que a avaliação de uma expressão é atrasada até que seu valor percebido seja realmente necessário. A execução adiada pode melhorar 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 habilita apenas uma única iteração por meio da coleção de origem.

As tecnologias LINQ fazem uso extensivo da execução adiada nos membros das classes principais System.Linq e nos métodos de extensão nos vários 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. Esse iterador deve retornar uma coleção de tipo IEnumerator ou IEnumerator<T> (ou um tipo derivado).

Avaliação adiantada versus lenta

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

  • Na avaliação lenta, um único elemento da coleção de origem é processado durante cada chamada para o iterador. Essa é a maneira típica pela qual os iteradores são implementados.
  • 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 OrderBy método precisa classificar toda a coleção antes de retornar o primeiro elemento.

A avaliação lenta geralmente gera melhor desempenho porque distribui o processamento de sobrecarga uniformemente durante a avaliação da coleção e minimiza o uso de dados temporários. É claro que, para algumas operações, não há outra opção a não ser materializar resultados intermediários.

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

Consulte também