Gewusst wie: Angeben von Zusammenführungsoptionen in PLINQ

In diesem Beispiel wird gezeigt, wie Sie Zusammenführungsoptionen für alle nachfolgenden Operatoren in einer PLINQ-Abfrage angeben. Sie müssen Zusammenführungsoptionen nicht explizit festlegen, dies kann jedoch zu einer Leistungsverbesserung beitragen. Weitere Informationen zu Zusammenführungsoptionen finden Sie unter Zusammenführungsoptionen in PLINQ.

WarnhinweisVorsicht

Dieses Beispiel soll die Verwendung veranschaulichen, und es wird möglicherweise nicht schneller als die entsprechende sequenzielle LINQ to Objects-Abfrage ausgeführt.Weitere Informationen über Geschwindigkeitssteigerungen finden Sie unter Grundlagen zur Beschleunigung in PLINQ.

Beispiel

Im folgenden Beispiel wird das Verhalten von Zusammenführungsoptionen in einem grundlegenden Szenario gezeigt, das eine ungeordnete Quelle aufweist und eine rechenintensive Funktion auf jedes Element anwendet.

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);
        }
    }
}

Wenn die AutoBuffered-Option unerwünschte Wartezeit verursacht, bevor das erste Element ausgegeben wird, können Sie versuchen, mit der NotBuffered-Option Ergebniselemente schneller und reibungsloser auszugeben.

Siehe auch

Referenz

ParallelMergeOptions

Konzepte

Paralleles LINQ (PLINQ)

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

Mai 2010

Hinweis bezüglich Verwendung und Geschwindigkeitssteigerung hinzugefügt.

Kundenfeedback.