Ejecución aplazada y evaluación diferida en LINQ to XML

Las operaciones de consulta y de eje a menudo se implementan para usar la ejecución aplazada.Este tema describe los requisitos y las ventajas de la ejecución aplazada, y algunas consideraciones acerca de la implementación.

Ejecución aplazada

La ejecución aplazada implica que la evaluación de una expresión se retrase hasta que su valor realizado sea realmente necesario.La ejecución aplazada puede mejorar considerablemente el rendimiento cuando deba manipular grandes recolecciones de datos, sobre todo en programas que contengan una serie de manipulaciones o consultas encadenadas.En el mejor de los casos, la ejecución aplazada solo habilita una iteración a través de la recolección de origen.

Las tecnologías LINQ usan intensivamente la ejecución aplazada tanto en los miembros de las clases System.Linq principales como en los métodos de extensión de los diversos espacios de nombres LINQ, por ejemplo, System.Xml.Linq.Extensions.

El lenguaje C# admite directamente la ejecución aplazada mediante la palabra clave yield (en forma de instrucción yield-return) cuando se usa en un bloque de iteradores.Este tipo de iterador debe devolver una colección de tipo IEnumerator o IEnumerator<T> (o bien un tipo derivado).No hay equivalentes de la palabra clave yield en Visual Basic 9.0, de modo que la implementación de la ejecución aplazada en este lenguaje resulta más complicado.

Diferencias entre la evaluación diligente yla evaluación diferida

Al escribir un método que implemente una ejecución aplazada, también debe decidir si implementa el método con la evaluación diferida o la evaluación diligente.

  • En la evaluación diferida, un elemento de la colección de origen se procesa durante cada llamada al iterador.Esta es la forma habitual en la que se implementan los iteradores.

  • En la evaluación diligente, la primera llamada al iterador hará que se procese toda la colección.Es posible que también se requiera una copia temporal de la colección de origen.Por ejemplo, el método OrderBy debe ordenar toda la colección antes de devolver el primer elemento.

Normalmente, la evaluación diferida presenta un mejor rendimiento, ya que distribuye el procesamiento de sobrecarga de forma equitativa durante la evaluación de la colección y minimiza el uso de los datos temporales.Obviamente, para algunas operaciones, no existe otra alternativa que materializar resultados intermedios.

Pasos siguientes

El siguiente tema de este tutorial ilustra la ejecución aplazada:

Vea también

Referencia

yield (Referencia de C#)

Conceptos

Tutorial: encadenar cadenas juntas

Conceptos y terminología (transformación funcional)

Operaciones de agregación