方法: PLINQ のマージ オプションを指定するHow to: Specify Merge Options in PLINQ

この例では、PLINQ クエリの後続のすべての演算子に適用されるマージ オプションを指定する方法を示します。This example shows how to specify the merge options that will apply to all subsequent operators in a PLINQ query. マージ オプションを明示的に設定する必要はありませんが、設定することでパフォーマンスが向上する可能性があります。You do not have to set merge options explicitly, but doing so may improve performance. マージ オプションの詳細については、「PLINQ のマージ オプション」を参照してください。For more information about merge options, see Merge Options in PLINQ.

警告

この例は、使用方法を示すことを意図したものであるため、同等の順次的な LINQ to Objects クエリほど高速ではない可能性があります。This example is intended to demonstrate usage, and might not run faster than the equivalent sequential LINQ to Objects query. 高速化の詳細については、「PLINQ での高速化について」を参照してください。For more information about speedup, see Understanding Speedup in PLINQ.

Example

次の例では、順序付けされていないソースがあり、すべての要素に負荷が大きい関数を適用する基本的なシナリオでのマージ オプションの動作を示します。The following example demonstrates the behavior of merge options in a basic scenario that has an unordered source and applies an expensive function to every element.

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 = 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

最初の要素が生成される前に AutoBuffered オプションで望ましくない待機時間が発生した場合は、結果要素をより速く、よりスムーズに生成するために NotBuffered オプションを試してください。In cases where the AutoBuffered option incurs an undesirable latency before the first element is yielded, try the NotBuffered option to yield result elements faster and more smoothly.

関連項目See also