Algoritimde çok büyük bir veri kümesinde çok sıkı bir döngü oluşturan bir yöntem var. Aslında orijinal olan tek iş parçacığını yazdım, ama çok uzun sürdü. Şimdi onu hızlandırmak istediğim noktaya geldim, bu yüzden şimdi çalışmaları paralel hale getirmek için ThreadPool'u kullanıyorum. Sorun şu ki, CPU kullanımımın% 95-100'e çıkmasını bekledim, ki bu da beklediğim gibi. Ancak, performansım önemli ölçüde arttı, ancak tüm bağlam geçişlerini azaltabilseydim daha iyi yapabileceğimi düşünüyorum. Bu, diğer programların CPU kaynakları için iş parçacığıyla mücadele etmeleri gerektiğinden biraz lagy olmalarına da neden oluyor.ThreadPool geri döngüde geri arama -% 100 CPU
Sorum şu: Bu işi nasıl yapacağım? Düşünebildiğim tek şey, bir seferde çalışan iş parçacığı sayısını sınırlamaktır, ancak bu algoritmamı yavaşlatır, çünkü yalnızca birkaç iş parçacığı bir seferde çalışabilir. Ben sadece algoritma sadece mümkün olduğunca çabuk tamamlamak için çalıştırmak için ihtiyacım var çünkü benim konularımda uyku eklemek istemiyorum.
DÜZENLEME: Birçok kişi TPL'yi kullandığından bahsetmiştir. Bence bu harika bir fikir ama maalesef, .NET 4 kullanarak henüz bir sürüm yayınlamadığı için .NET 3.5 kullanarak takıldığımdan bahsetmeyi unuttum. Bir IEnumerable
üzerinde foreach
döngüye ana uygulamayı yeniden yazabilirsiniz Eğer
Hız istiyorsanız, neden tüm hız şeylerini çıkarırsınız? İçerik anahtarı işletim sistemi tarafından yapılır, bununla uğraşmazsınız ... – gbianchi
Çözüm, havuzdaki iş parçacıklarının önceliğini azaltmaktır. Bu bir cevap değil çünkü verimli bir şekilde nasıl yapılacağını bilmiyorum :( –
Bireysel görevleri daha büyük hale getirmeniz gerektiği gibi geliyor OTOH, iş parçacığı önerilerinizin çoğunu zaten yapacak kadar akıllı. Daha fazla göreviniz varsa CPU'lardan ziyade, daha fazla iş parçacığı başlatmak yerine onları sıraya koyacaktır –