2012-03-25 13 views
8

Kodumda Parallel.ForEach ve PLINQ kullanımı ne kadar çok olursa, daha fazla yüz ve kod incelemesi geri adım atıyorum. Bu yüzden, her LINQ ifadesinde PLINQ'ı aşırı uçta kullanmamın bir sebebi var mı? Çalışma zamanı, uygulama performansının iyileştirmek yerine gerçekten bozulacağı kadar çok iş parçacığı (veya iş parçacığı havuzundan çok fazla iş parçacığı tüketen) üretmeye başlamak için yeterince akıllı olamaz mı? Aynı soru Paralel kütüphane için de geçerlidir..NET 4 Parallel.ForEach ve PLINQ: İş parçacığı havuzunu bunaltabilir ve uygulama performansını öldürebilirler mi?

İş parçacığı güvenliği ve çoklu iş parçacığı kullanmanın ek yüküyle ilgili sonuçları anlıyorum. Ayrıca her şeyin paralelleştirmek için iyi olmadığını anlıyorum. Bütün bu yaklaşımları savunmaktan vazgeçip durmamam ve eğer bu iki iyi şeyden vazgeçmemi isterim diye düşünürsünüz, çünkü akranlarım .NET tesislerine güvenmek yerine iş parçacığı kontrolünü kendim yapar mıyım?

GÜNCELLEME: lütfen, donanımın çok kullanımlı kullanım için önkoşulları yerine getirmek için yeterince iyi olduğunu varsayalım.

+0

El ile ayarlamadığınız sürece plinq yalnızca –

+0

@ LukeMcGregor olan çekirdek sayısına bağlı olarak birkaç iş parçacığı kullanır: Varsayılanları ve bunları nasıl değiştireceğinizi biliyor musunuz? – Schultz9999

cevap

3

Eğer .WithDegreeOfParallelism (N) kullanabilirsiniz işçi iş parçacığı sayısını ayarlamak için

örn

var query = from item in source.AsParallel().WithDegreeOfParallelism(2) 
      where Compute(item) > 42 
      select item; 

Bkz http://msdn.microsoft.com/en-us/library/dd997425.aspx

4

Hepsi aşağı iki şey geliyor:

  1. koleksiyonunu bölümlemek ve düzenli bir foreach kıyasla performans kazancı daha büyük konuları eşitlemek için gerekli ekstra çalışma var mı?

  2. Tüm iş parçacıkları şişe boynuna dönüşecek paylaşılan bir kaynak kullanacak mı?

ikinci durumda bir örnek

bir Linq to Sql ifadenin sonuçları üzerinde bir Parallel.ForEach yapıyor. Bu durumda, sonuçlarınız DB'den çok yavaş geliyorsa, her bir iş parçacığı, bir şeyleri yapmaktan ziyade, verilerin işlenmesini beklemek için daha fazla zaman harcayabilir.

Bkz: http://msdn.microsoft.com/en-us/library/dd997392.aspx

+0

Sayısal tüketicilerden bazı hesaplamalı eylemleri (db aramaları, başka kaynakları beklemiyorum) uygulama ihtiyacım olduğunu söyleyeyim, sonuç olarak senkronize edilmiş koleksiyonda saklıyorum (bu bir ceza olabilir). Bu yüzden Parallel.ForEach (tüketiciler, c => ...) 'i basit foreach'dan daha hızlı olacak umuduyla yazardım. Anlıyorum ki, gerçek performans profili olmadan, benim umutlarım haklı çıkarsa, söylemesi zor. Ancak naif akıl yürütmekten bu yaklaşım doğru görünüyor. – Schultz9999

+0

Doğru görünüyor. Ama yine de, her müşteri için biraz hesaplama işi yapmak zorunda kalacaktınız. Örneğin, basit bir aritmetik hesaplama, paralelliği haklı çıkarmak için yeterli olmayacaktır. – Diego

2

zaman performans sorular bu işe kazı derin, bence en iyi şey ... ölçmek, ölçmek ve ölçmek. Birisi PLINK'in harika olduğunu ve uygulamanızın performansını artırabileceğini söylese bile, profil oluşturmadan doğrulama yapmadan güvenir misiniz? Genel cevaplar mevcut olsa da, kesin durumunuzdaki performansı ölçmek için çaba sarf edemezsiniz. Genel performans pek çok şeye bağlıdır ve PLINK bir durumda yardımcı olur, ancak diğerinde olmaz.
PLINK ile yaptığım kişisel deneyimlerim, her LINQ sorgusunun PLINK'e gönderilmesinden sonra, yükün küçük olduğu durumlarda tepki sürelerinin çok daha iyi olması ve yükün maksimumda olduğu zaman hiçbir fark olmamasıdır. Ancak, PLINK'in genel performansı büyük bir yük altında hafiflettiği bir durumu hayal edebiliyorum. Kendi özel durumunuz için kontrol etmelisiniz.
Peki, diğer insanlara doğru yolda yürüdüğünüzü ikna etmek istiyorsanız, ölçüm sonuçlarından başka ne olabilir?

İlgili konular