Como: Especificar opções de mesclagem no PLINQ
Este exemplo mostra como especificar as opções de mesclagem que serão aplicadas a todos os operadores subseqüentes em uma consulta PLINQ. Não é necessário definir explicitamente as opções de mesclagem, mas ao fazer isso pode melhorar desempenho. Para obter mais informações sobre as opções de mesclagem, consulte Mesclar as opções de PLINQ.
Cuidado |
---|
Este exemplo destina-se para demonstrar o uso e pode não ser executado mais rápido do que o equivalente LINQ to Objects seqüencial de consulta de.Para obter mais informações sobre o aumento de velocidade, consulte Aumento de velocidade de compreensão no PLINQ. |
Exemplo
O exemplo a seguir demonstra o comportamento das opções de mesclagem em um cenário básico que possui uma fonte não-ordenada e se aplica a uma função cara para cada 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);
}
}
}
Em casos onde o AutoBuffered opção incorre uma latência indesejável antes do primeiro elemento é gerou, tente o NotBuffered a opção para gerar os elementos do resultado mais rápida e uniformemente.
Consulte também
Referência
Conceitos
Histórico de alterações
Date |
History |
Motivo |
---|---|---|
Maio de 2010 |
Observação adicionada referentes ao uso vs. aumento de velocidade. |
Comentários do cliente. |