Compartir a través de


Cómo: Especificar opciones de combinación en PLINQ

En este ejemplo se muestra cómo especificar las opciones de combinación que se aplicarán a todos los operadores subsiguientes en una consulta PLINQ. No tiene que establecer las opciones de combinación explícitamente, pero, si lo hace, puede mejorar rendimiento. Para obtener más información acerca de las opciones de combinación, vea Opciones de combinación en PLINQ.

Nota de precauciónPrecaución

Este ejemplo está diseñado para mostrar el uso y podría no ejecutarse más rápidamente que la consulta secuencial equivalente de LINQ to Objects.Para obtener más información sobre la aceleración, vea Introducción a la velocidad en PLINQ.

Ejemplo

En el siguiente ejemplo se muestra el comportamiento de las opciones de combinación en un escenario básico que tiene un origen no ordenado y aplica una función que utiliza muchos recursos a cada elemento.

Class MergeOptions2


    Sub DoMergeOptions()

        Dim nums = Enumerable.Range(1, 10000)

        ' Replace NotBuffered with AutoBuffered 
        ' or FullyBuffered to compare behavior.
        Dim scanLines = From n In nums.AsParallel().WithMergeOptions(ParallelMergeOptions.NotBuffered)
              Where n Mod 2 = 0
              Select ExpensiveFunc(n)

        Dim sw = System.Diagnostics.Stopwatch.StartNew()
        For Each line In scanLines
            Console.WriteLine(line)
        Next

        Console.WriteLine("Elapsed time: {0} ms. Press any key to exit.")
        Console.ReadKey()

    End Sub
    ' A function that demonstrates what a fly
    ' sees when it watches television :-)
    Function ExpensiveFunc(ByVal i As Integer) As String
        System.Threading.Thread.SpinWait(2000000)
        Return String.Format("{0} *****************************************", i)
    End Function
End Class
namespace MergeOptions
{
    using System;
    using System.Diagnostics;
    using System.Linq;
    using System.Threading;

    class Program
    {
        static void Main(string[] args)
        {

            var nums = Enumerable.Range(1, 10000);

            // Replace NotBuffered with AutoBuffered 
            // or FullyBuffered to compare behavior.
            var scanLines = from n in nums.AsParallel()
                                .WithMergeOptions(ParallelMergeOptions.NotBuffered)
                            where n % 2 == 0
                            select ExpensiveFunc(n);

            Stopwatch sw = Stopwatch.StartNew();
            foreach (var line in scanLines)
            {
                Console.WriteLine(line);
            }

            Console.WriteLine("Elapsed time: {0} ms. Press any key to exit.",
                            sw.ElapsedMilliseconds);
            Console.ReadKey();
        }

        // A function that demonstrates what a fly
        // sees when it watches television :-)
        static string ExpensiveFunc(int i)
        {
            Thread.SpinWait(2000000);
            return String.Format("{0} *****************************************", i);
        }
    }
}

Cuando la opción AutoBuffered incurre en una latencia no deseable antes de proporcionar el primer elemento, pruebe la opción NotBuffered para proporcionar elementos del resultado de una manera más rápida y sencilla.

Vea también

Referencia

ParallelMergeOptions

Conceptos

Parallel LINQ (PLINQ)

Historial de cambios

Fecha

Historial

Motivo

Mayo de 2010

Nota agregada sobre el uso frente a la aceleración.

Comentarios de los clientes.