كيفية القيام بما يلي: تسريع نصوص تكرار حلقي صغيرة
عندما For()تكرار حلقي يحتوي على نص مربع متوسط، قد ينفذ أبطأ من المكافئ تكرار حلقي متسلسلة. تحدث أقل في الأداء بسبب مقدار الحمل المتضمنة في تقسيم بيانات والتكلفة من استدعاء مفوض في كل تكرار للحلقة. لمواجهة هذه السيناريوهات، Partitionerتوفر الفئة Createالأسلوب، والتي تمكنك من توفير تكرار حلقي متسلسلة للنص الأساسي للمفوض، حيث المفوض هو استدعاؤها مرة واحدة فقط في كل قسم، بدلاً من مرة واحدة في كل تكرار. لمزيد من المعلومات، راجع مخصص Partitioners PLINQ و TPL.
مثال
' Source must be array or IList.
Dim source = Enumerable.Range(0, 100000).ToArray()
' Partition the entire source array.
' Let the partitioner size the ranges.
Dim rangePartitioner = Partitioner.Create(0, source.Length)
Dim results(source.Length - 1) As Double
' Loop over the partitions in parallel. The Sub is invoked
' once per partition.
Parallel.ForEach(rangePartitioner, Sub(range, loopState)
' Loop over each range element without a delegate invocation.
For i As Integer = range.Item1 To range.Item2 - 1
results(i) = source(i) * Math.PI
Next
End Sub)
// Source must be array or IList.
var source = Enumerable.Range(0, 100000).ToArray();
// Partition the entire source array.
var rangePartitioner = Partitioner.Create(0, source.Length);
double[] results = new double[source.Length];
// Loop over the partitions in parallel.
Parallel.ForEach(rangePartitioner, (range, loopState) =>
{
// Loop over each range element without a delegate invocation.
for (int i = range.Item1; i < range.Item2; i++)
{
results[i] = source[i] * Math.PI;
}
});
يعمل هذا الأسلوب بشكل جزئي تجاوز منطق موازنة تحميل داخل Forأسلوب و مفيدة أساسا عندما تنفذ الحلقة مقداراً قليلاً من العمل. كـ يصبح العمل الممكن أكثر تكلفة، فمن المحتمل أن تحصل أداء أفضل باستخدام متوازي For.
راجع أيضًا:
المرجع
المبادئ
بيانات متوازى ism (مكتبة متوازى المهام)
لامدا التعبيرات في PLINQ و TPL