مشاركة عبر


فهم زيادةالسرعة في PLINQ

الهدف الأساسي من PLINQ هو لزيادة سرعة تنفيذ LINQ استعلامات الكائنات قبل تنفيذ الاستعلام المفوضون في نفس الوقت تشغيل أجهزة الكمبيوتر multi-core. PLINQ أداء أفضل عند معالجة كل عنصر في مجموعة مصدر هو مستقلة، مع عدم وجود الولاية مشتركة المتضمنة بين المفوضون الفردية. عام في LINQ الكائنات و PLINQ مثل هذه العمليات، وغالباً ما تسمى“ متوازى delightfully ” لأنها كانت تضفي أنفسهم بسهولة بجدولة تشغيل مؤشرات ترابط متعددة. ومع ذلك، لا تقوم الجميع الاستعلامات إلا يتكون تماما من delightfully متوازى عمليات؛ في معظم الحالات، استعلام يتضمن بعض العوامل التي لا تكون متوازى ized، أو الذي يؤدي إلى إبطاء متوازى التنفيذ. وحتى مع الاستعلامات التي تقوم بشكل كامل delightfully متوازى، يجب أن لا تزال قسم بيانات المصدر، ثم قم بجدولة العمل تشغيل عمليات جزئية PLINQ، ودمج نتائج عادة عند اكتمال الاستعلام. إضافة الجميع هذه العمليات إلى تكلفة الحسابية parallelization؛ تسمى هذه التكاليف من إضافة parallelization زائد عن الحد . لتحقيق الأداء الأمثل في استعلام PLINQ، فهدف هو زيادة الأجزاء التي تم delightfully متوازى والتقليل من الأجزاء التي تتطلب مقدار حمل. توفر هذه المقالة معلومات لمساعدتك في كتابة PLINQ الاستعلامات التي يتم كـ الفعال كـ ممكنة بينما لا يزال الحصول على نتائج الصحيحة.

factors هذا الاستعلام PLINQ تأثير الأداء

تسرد الأقسام التالية بعض أهم العوامل التي تؤثر على متوازى الاستعلام عن الأداء. هذه هي عبارات عام التي لم تكن كافية بأنفسهم إلى توقع أداء الاستعلام في كل الحالات. كما دائماً، هو هامة لقياس الأداء الفعلي استعلامات معينة تشغيل أجهزة الكمبيوتر مع نطاق من التكوينات تمثيلية والتحميلات.

  1. الحسابية تكلفة العمل ككل.

    لتحقيق زيادةالسرعة، استعلام PLINQ يجب أن يكفي delightfully متوازى العمل لإزاحة بمقدار الحمل. يمكن التعبير عن العمل كـ تكلفة كل المفوض الحسابية مضروباً بعدد العناصر في مجموعة الموارد. بالافتراض أن يمكن أن تكون عملية parallelized، المزيد الثمن الممكن هو، زاد الفرصة زيادةالسرعة. تشغيل سبيل المثال، إذا استغرق دالة ملى ثوان واحدة للتنفيذ، استعلام متسلسلة تشغيل عناصر 1000 نافذة ثانية واحدة للقيام بهذه العملية، بينما متوازى قد يستغرق الاستعلام تشغيل كمبيوتر مع أساسيات الرابع فقط 250 ميلي ثانية. وتؤدي هذه زيادةالسرعة 750 ملى ثوان. إذا كانت دالة مطلوب ثانية واحدة لتنفيذ لكل عنصر، قد يكون زيادةالسرعة ثانية 750. إذا كان المفوض هو مكلفة جداً، ثم PLINQ قد تقدم زيادةالسرعة كبير مع بعض عناصر فقط في مجموعة الموارد. وعلى العكس، مربع متوسط المصدر مجموعات بالتفويضات العادية غير عادة مرشحي جيد ل PLINQ.

    في المثال التالي، queryA هو فمن المحتمل أن يتضمن وجود مرشح جيد ل PLINQ، باعتبار أن thatits الدالة تحديد كثير من العمل. queryB هو فمن المحتمل أن لا وجود مرشح جيد لأن هناك هو إلى إزاحة العمل غير كافية في بيان تحديد، ومقدار الحمل من parallelization معظم أو جميعها زيادةالسرعة.

    Dim queryA = From num In numberList.AsParallel()
                 Select ExpensiveFunction(num); 'good for PLINQ
    
    Dim queryB = From num In numberList.AsParallel()
                 Where num Mod 2 > 0
                 Select num; 'not as good for PLINQ
    
    var queryA = from num in numberList.AsParallel()
                 select ExpensiveFunction(num); //good for PLINQ
    
    var queryB = from num in numberList.AsParallel()
                 where num % 2 > 0
                 select num; //not as good for PLINQ
    
  2. رقم من أساسيات المنطقية في النظام (درجة parallelism).

    هذه النقطة هو corollary واضحة إلى مقطع السابق، الاستعلامات التي يتم delightfully متوازى لتعمل بشكل أسرع تشغيل أجهزة الكمبيوتر مع أساسيات أكثر لأنه يمكن تقسيم العمل بين عمليات جزئية المتزامنة أكثر. إجمالي مقدار زيادةالسرعة يعتمد تشغيل ما هي النسبة المئوية للعمل ككل من استعلام هو parallelizable. على الرغم من ذلك، هل لا كـ sume تقوم بتشغيل الجميع الاستعلامات مرتين كـ fكـt على كمبيوتر أساسية ثمانية كـ أربع الأساسي لجهاز الكمبيوتر. عند ضبط الاستعلامات للحصول تشغيل أداء أمثل، هو هامة لالمقياس نتائج الفعلية تشغيل أجهزة الكمبيوتر التي تحتوي تشغيل أرقام مختلفة من أساسيات. Th هو أشر هو المتعلقة باليؤشر رقم 1: مطلوبة datasets بقعة صغيرة إلى الاستفادة من موارد بقعة صغيرة بين أجهزة الكمبيوتر.

  3. العدد و نوع من العمليات.

    يوفر PLINQ العامل AsOrdered المواقف في عليها هو ضرورية للحفاظ على ترتيب العناصر في التسلسل المصدر. هناك هو تكلفة المقترنة بالترتيب، ولكن th هو التكلفة هو المعتدلة عادة. تتطلب العمليات الانضمام و GroupBy كذلك مقدار زائد عن الحد. ينجز PLINQ بشكل أفضل عندما يتم السماح بمعالجة العناصر في مجموعة الموارد في أي ترتيب، وتمريرها إلى العامل التالية بمجرد أن تصبح جاهزة. لمزيد من المعلومات، راجع ترتيب بها في PLINQ.

  4. الشكل استعلام التنفيذ.

    إذا تم تخزين نتائج الاستعلام بواسطة استدعاء ToArray أو ToList، ثم النتائج من الجميع عمليات جزئية المتوازية يجب أن يمكن دمجها في بنية بيانات واحدة. هذا يشمل تكلفة الحسابية unavoidable. وبالمثل، إذا قمت بتكرار نتائج بواسطة استخدام تكرار حلقي foreach (لكل في Visual أساسى)، نتائج من مؤشرات ترابط العاملين تحتاج إلى يمكن إجراء تسلسل إلى مؤشر ترابط العداد. ولكن إذا أردت فقط لتنفيذ بعض الإجراءات استناداً إلى الناتج من كل مؤشر ترابط، يمكنك استخدم الأسلوب ForAll للقيام بهذا العمل تشغيل مؤشرات ترابط متعددة.

  5. نوع خيارات دمج.

    يمكن تكوين PLINQ للمخزن المؤقت للإخراج الخاص به، وإنتاج النصوص أو بعد التعيين النتائج بأكملها مرة واحدة هو إنتاج، أو ما إلى دفق النتائج الفردية عند إنشائها. النتيجة السابقة هو يقل الوقت الكلي للتنفيذ والنتائج الأخيرة في زمن المنخفض بين عناصر yielded. بينما الخيارات دمج دائماً لم يكن تأثير رئيسي تشغيل الأداء العام في الاستعلام، يمكن أن يؤثر أداء الملحوظة لأن التحكم بمدة مستخدم يجب الانتظار إلى رؤية نتائج. لمزيد من المعلومات، راجع دمج خيارات في PLINQ.

  6. نوع التقسيم.

    في بعض الحالات، الاستعلام PLINQ عبر indexable المصدر مجموعة قد ينتج تحميل عمل unbalanced. عند حدوث ذلك، فقد يكون بإمكانك إلى زيادة أداء الاستعلام بإنشاء cusإلىm partitioner. لمزيد من المعلومات، راجع مخصص Partitioners PLINQ و TPL.

عندما اختار PLINQ الوضع التسلسلي

PLINQ دائماً ستحاول إلى ينفذ استعلام على الأقل وفق سرعة قد تشغيل الاستعلام بشكل تسلسلي. وعلى الرغم من أنه لم انظر PLINQ كيف الثمن الممكن تكون المفوضون مستخدم، أو كيفية كبير مصدر إدخال هو، يبدو للاستعلام معينة "الاشكال". بشكل خاص، فإنه يبحث عن عوامل تشغيل الاستعلام أو تركيبة من عوامل التشغيل التي عادة ما يؤدي استعلام التنفيذ بشكل أكثر بطئا في متوازى الالوضع. عند العثور على هذه الأشكال، PLINQ ب الافتراضي يعود إلى الوضع متسلسلة.

على الرغم من ذلك، بعد قياس أداء استعلام محدد، قد حددت أنه فعلا تشغيلها بشكل أسرع متوازى الالوضع. في مثل هذه الحالات، يمكنك استخدام ParallelExecutionMode.ForceParallelismوضع علامة بواسطة ParallelEnumerableWithExecutionMode()أسلوب إلى إرشاد PLINQ إلى parallelize الاستعلام. لمزيد من المعلومات، راجع كيفية القيام بما يلي: قم بتحديد "الوضع" تنفيذ "في PLINQ.

وتصف القائمة التالية الأشكال الاستعلام PLINQ ذلك عن طريق الافتراضي التنفيذ في الوضع المتسلسلة:

  • الاستعلامات التي تحتوي على تحديد، تتم تمت الفهرسة الموقع، تتم تمت الفهرسة SelectMany، أو جملة ElementAt بعد عامل التصفية أو الطلب التي تم إزالتها أو إعادة ترتيبها الأصلي الفهارس.

  • الاستعلامات التي تحتوي على تخطي الانتقال، TakeWhile،، عامل SkipWhile و حيث الفهارس في تسلسل المصدر غير موجودة في الترتيب الأصلي.

  • الاستعلامات التي تحتوي على البريدي أو SequenceEquals، إلا إذا كان واحد المصادر البيانات لإنشاء فهرس مرتبة أصلاً ومصدر بيانات آخر هو indexable (على سبيل المثال: صفيفة أو IList(T)).

  • الاستعلامات التي تحتوي على Concat، إلا أنه هو المطبق على المصادر بيانات indexable.

  • الاستعلامات التي تحتوي على عكسى، إلا إذا كان تطبيق إلى مصدر بيانات indexable.

راجع أيضًا:

المبادئ

متوازى LINQ (PLINQ)