Share via


Cara: Menentukan Opsi Penggabungan di PLINQ

Contoh ini memperlihatkan cara menentukan opsi penggabungan yang akan berlaku untuk semua operator berikutnya dalam kueri PLINQ. Anda tidak perlu mengatur opsi penggabungan secara eksplisit, tetapi melakukannya dapat meningkatkan performa. Untuk informasi selengkapnya tentang opsi penggabungan Opsi Penggabungan di PLINQ.

Peringatan

Contoh ini dimaksudkan untuk menunjukkan penggunaan dan mungkin tidak berjalan lebih cepat daripada kueri LINQ berurutan yang setara ke kueri Objek. Untuk informasi selengkapnya, lihat Memahami Percepatan di PLINQ.

Contoh

Contoh berikut menunjukkan perilaku opsi penggabungan dalam skenario dasar yang memiliki sumber yang tidak berurutan dan menerapkan fungsi mahal untuk setiap elemen.

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);
        }
    }
}
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 = 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
        Threading.Thread.SpinWait(2000000)
        Return String.Format("{0} *****************************************", i)
    End Function
End Class

Dalam penentuan huruf di mana AutoBuffered opsi menimbulkan latensi yang tidak diinginkan sebelum elemen pertama dihasilkan, cobalah NotBuffered opsi untuk menghasilkan elemen hasil lebih cepat dan lebih lancar.

Lihat juga