Also Thema sind die Fragen.Wie die AsParallel-Erweiterung funktioniert
ich diese Methode AsParallel Wrapper liefert ParallelQuery<TSource>
, die die gleichen LINQ Schlüsselwörter verwendet, sondern von System.Linq.ParallelEnumerable
statt System.Linq.Enumerable
klar Es ist genug, aber wenn ich in dekompilierten Quellen suchen, ich verstehe nicht, wie funktioniert Es klappt.
Beginnen wir mit einer einfachen Erweiterung: Sum() -Methode. Code:
[__DynamicallyInvokable]
public static int Sum(this ParallelQuery<int> source)
{
if (source == null)
throw new ArgumentNullException("source");
else
return new IntSumAggregationOperator((IEnumerable<int>) source).Aggregate();
}
es klar ist, lassen Sie uns zu Aggregate()
Methode. Es ist ein Wrapper für InternalAggregate-Methode, die einige Ausnahmen festhält. Sehen wir uns das jetzt an.
protected override int InternalAggregate(ref Exception singularExceptionToThrow)
{
using (IEnumerator<int> enumerator = this.GetEnumerator(new ParallelMergeOptions?(ParallelMergeOptions.FullyBuffered), true))
{
int num = 0;
while (enumerator.MoveNext())
checked { num += enumerator.Current; }
return num;
}
}
und hier ist die Frage: wie es funktioniert? Ich sehe keine Konkurrenzsicherheit für eine Variable, die von vielen Threads modifiziert wird, wir sehen nur Iterator und Summierung. Ist es ein magischer Enumerator? Oder wie funktioniert es? GetEnumerator()
gibt QueryOpeningEnumerator<TOutput>
zurück, aber der Code ist zu kompliziert.
wenn "Es gibt hier kein Multithreading" Warum berechnet sum2 3 mal schneller als sum1? http://i.imgur.com/Z4CtyUz.png –
@AlexJoukovsky: Ich testete dies und die 'AsParallel'-Version ist zwar schneller, aber ich habe keine Ahnung, wie das möglich ist, zumal die Eingabeaufzählung auch auf einem einzigen verarbeitet wird thread auf einmal. Bizarr. – Steven
Partialsummen könnten parallel verarbeitet und dann kombiniert werden. – usr