Comment : spécifier des options de fusion en PLINQ
Cet exemple indique comment spécifier les options de fusion qui s'appliqueront à tous les opérateurs suivants dans une requête PLINQ. Vous n'avez pas à définir les options de fusion explicitement, mais cela peut améliorer les performances. Pour plus d'informations sur les options de fusion, consultez Options de fusion en PLINQ.
Attention |
---|
Cet exemple est destiné à montrer l'utilisation et peut ne pas s'exécuter plus rapidement que la requête LINQ to Objects séquentielle équivalente.Pour plus d'informations sur l'accélération, consultez Fonctionnement de l'accélération dans PLINQ. |
Exemple
L'exemple suivant montre le comportement des options de fusion dans un scénario de base avec une source non classée et une fonction coûteuse à chaque élément.
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);
}
}
}
Dans les cas où l'option AutoBuffered entraîne une latence indésirable avant que le premier élément ne soit transmis, essayez l'option NotBuffered pour transmettre les éléments de résultat plus rapidement et plus facilement.
Voir aussi
Référence
Concepts
Historique des modifications
Date |
Historique |
Motif |
---|---|---|
Mai 2010 |
Remarque ajoutée concernant l'utilisation et l'accélération. |
Commentaires client. |