Procedura: specificare le opzioni di unione in PLINQ
In questo esempio viene mostrato come specificare le opzioni di unione che verranno applicate a tutti gli operatori successivi in una query PLINQ. Benché non sia necessario impostare in modo esplicito le opzioni di unione, questa operazione può comportare un miglioramento delle prestazioni. Per ulteriori informazioni sulle opzioni di unione, vedere Opzioni di unione in PLINQ .
Attenzione |
---|
Lo scopo di questo esempio è dimostrare l'utilizzo e potrebbe non essere eseguito più velocemente dell'equivalente query LINQ to Objects sequenziale.Per ulteriori informazioni sull'aumento di velocità, vedere Informazioni sull'aumento di velocità in PLINQ. |
Esempio
Nell'esempio seguente viene mostrato il comportamento delle opzioni di unione in uno scenario di base in cui è presente un'origine non ordinata e si applica una funzione dispendiosa a ogni 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);
}
}
}
Nei casi in cui l'opzione AutoBuffered comporti una latenza indesiderata prima che venga prodotto il primo elemento, tentare l'opzione NotBuffered per produrre elementi di risultato in modo più veloce ed efficiente.
Vedere anche
Riferimenti
Concetti
Cronologia delle modifiche
Data |
Cronologia |
Motivo |
---|---|---|
Maggio 2010 |
Aggiunta nota sull'utilizzo rispetto all'aumento di velocità. |
Commenti e suggerimenti dei clienti. |