2013-12-17 29 views
7

Geçtiğimiz günlerde Linq ve Plinq hakkında birkaç önlem aldım. Hangi durumun Plinq'in gerçek bir yararı olduğunu göremiyorum.PLINQ'in herhangi bir faydası var mı?

ben gibi pek çok örnek buldum:

Enumerable.Range(0, 10000).AsParallel().ForAll(_ => Thread.Sleep(50000)); 

o 10000 derecesiyle parallized edilebilir ve evet o zaman 10000 kat daha hızlı olacak çünkü bu, tamamen yararsız bir örnektir, ama bir iş görülmez 10000 kez döngü ve "IO işleri" yapmak için uygulama.

Birisi bir örnekten söz edebilirse, lütfen onu gönderin.

Plinq yalnızca Linq'den Objects ve Linq to XML için kullanılabilir. Web sunucusunda çalışan uygulamada kullanılması önerilmez (kendi iş parçacığı yönetimine sahiptir). Bu yüzden fırsatlarımız, birden çok çekirdeğe sahip masaüstü uygulamalarına indirgeniyor.

Genellikle, bir saniyenin kesirlerinde sırayla çalışan linq sorguları yazarım. Paralelleştirirsem ve gerçekten paralel koşarsa daha hızlı olur, ama kimin umurunda? Bence hala yeterince hızlı. Son kullanıcı herhangi bir fark görmeyecek.

Birisi tüm verileri DB'den aldığında ve sorguyu bellekte çalıştığında bir örnek hayal edebiliyorum. O zaman belki faydalıdır, ama yanlış bir tasarımdır.

TPL, uyumsuz programlama için iyi bir şeydir, ancak yine de Plinq'in kullanışlı bir araç olduğundan emin değilim.

Bu konuda olumlu deneyimler var mı? Eğer PLINQ yararlanabilirim hangi

+0

* "Bu Paralelin Her Zaman Daha Hızlı Olduğunu Düşünmeyin" * ... [PLINQ ile Potansiyel Tuzaklara] bakmanız gerekir (http://msdn.microsoft.com/en-us/library/dd997403%28v= vs.110% 29.aspx) !! –

+0

Teşekkürler, zaten içine baktım :) – speti43

+0

Kırık olmayan şeyleri düzeltmeye gerek yok. PLINQ, çok çekirdekli bilgisayarlarda büyük veri için mantıklı olabilir. –

cevap

7

anahtar senaryo böyle bir şeydir:

int[] src = Enumerable.Range(0, 100).ToArray(); 
var query = src.AsParallel() 
       .Select(x => ExpensiveFunc(x)); 

Ve gerçek faydalar olsun.

Yararlı olduğunda daha fazla ayrıntı için here numaralı makaleye bakın. Örneğin, grafik için bir dizi X noktasından bir dizi Y değerini hesaplamak için pahalı bir yinelemeli sayısal yöntemi değerlendirmeye çalışıyorum. yazmak için hızlı ve bakımı kolay olabilir olarak

+0

Hiç böyle bir kod yazdınız mı? Ben teorik olarak PLINQ yararını anlıyorum, ama ExpensiveFunc uygulamasını hayal edemiyorum, hala yanlış bir tasarım olduğuna inanıyorum. Paralel olarak daha hızlı olan ExpensiveFunc'in içinde ne olması gerekir? – speti43

+3

Evet, sahibim.24 çekirdekli bir makine kullanıyordum ve her biri ayrı ayrı hesaplamak için yaklaşık 200 ms'lik sayısal atma yapan 1000 veri noktasını hesaplamaya çalışıyordum. İşlem süresi yaklaşık 3 dakikadan 15 saniyeye düştü ve CPU'mn çoğu çekirdeğin çoğunda gayet iyi durumda kaldı. PLINQ sihirli bir çözüm değildir, ancak gerçek faydalar sağladığı durumlar vardır. (Benim durumumda, ExpensiveFunc içindeki kod, bir yarı iletken cihaz simülasyonu için ayrık nokta voltajlarını hesaplamak üzere yinelemeli matris çarpımı yapıyordu) – Baldrick

+0

Evet, bu mantıklı. Teşekkürler! – speti43

0

bir (i Veri ambarı EİH bir dizi PLINQ kullandığınız veri çok daha büyük peice ya da daha karmaşık bir görev

_objects.AsParallel().Select(ConvertObject); 

bool ConvertObject(object item) 
{ 
//some long running task 
} 

üzerine yaptığını deneyin genel performansın maliyeti belki de

Burada iş durumunun gelişme hızı olduğunu farz edelim.

İlgili konular