Eşzamanlı olarak çalıştırılan birimlerle en yüksek performans için, kendi iş parçacığı havuzunuzu yazın, burada başlangıçta bir İş Parçacığı nesneleri havuzunun oluşturulduğu ve engellemeye (önceden askıya alınmış), çalıştırılacak bir bağlamı bekleyerek (standart bir arabirime sahip bir nesne) senin kodun).
Görevler ve İş Parçacıkları ile .NET ThreadPool hakkındaki pek çok makale, performans için bir karar vermeniz için ihtiyacınız olanı gerçekten veremiyor. Ama onları karşılaştırdığınızda, İplikler kazanır ve özellikle bir İplikler havuzu. CPU'lar arasında en iyi şekilde dağıtılırlar ve daha hızlı başlarlar.
Tartışılması gereken, Windows'un ana yürütme biriminin (Windows 10 dahil) bir iş parçacığı olduğu ve işletim sistemi bağlam değiştirme yükünün genellikle ihmal edilebilir olduğu gerçeğidir. Basitçe söylemek gerekirse, bu makalelerin çoğunun ikna edici kanıtlarını bulamadım, makale, bağlam değiştirmeyi veya daha iyi CPU kullanımını kaydederek daha yüksek performans iddia etsin.
Şimdi biraz gerçekçilik için:
Çoğumuz uygulamamızın deterministik olmasına ihtiyaç duymayacağız ve çoğumuz, örneğin genellikle bir işletim sistemi geliştirmeyle birlikte gelen iş parçacıklarıyla sert bir arka plana sahip değiliz. Yukarıda yazdıklarım yeni başlayanlar için değil.
Bu yüzden tartışmak en önemli şey, programlamanın kolay olanıdır.
Kendi iş parçacığı havuzunuzu oluşturursanız, yürütme durumunu izleme, askıya alma ve devam ettirme simülasyonunun nasıl yapılacağı ve uygulamanın nasıl iptal edileceği ile ilgilenmeniz gerekeceğinden, uygulama genelinde dahil olmak üzere, biraz yazmanız gerekir. kapat. Havuzunuzu dinamik olarak büyütmek isteyip istemediğiniz ve havuzunuzun hangi kapasite sınırlamasına sahip olacağıyla da ilgilenmeniz gerekebilir. Bir saat içinde böyle bir çerçeve yazabilirim ama bunun sebebi bunu defalarca yapmış olmam.
Bir yürütme birimi yazmanın belki de en kolay yolu bir Görev kullanmaktır. Bir Görevin güzelliği, bir tane oluşturabilmeniz ve onu kodunuzda sıralı olarak başlatabilmenizdir (yine de dikkatli olunabilir). Görevi iptal etmek istediğinizde işlenecek bir iptal belirteci iletebilirsiniz. Ayrıca, olayları zincirlemek için söz yaklaşımını kullanır ve bunun belirli bir değer türü döndürmesini sağlayabilirsiniz. Dahası, async ve await ile daha fazla seçenek mevcuttur ve kodunuz daha taşınabilir olacaktır.
Temelde, Görevler ve İş Parçacıkları ile .NET ThreadPool karşılaştırmasının artılarını ve eksilerini anlamak önemlidir. Yüksek performansa ihtiyacım olursa, thread kullanacağım ve kendi havuzumu kullanmayı tercih ediyorum.
Karşılaştırmanın kolay bir yolu, 512 İş Parçacığı, 512 Görev ve 512 ThreadPool iş parçacığı başlatmaktır. Başlangıçta Threads ile bir gecikme bulacaksınız (bu nedenle, neden bir iş parçacığı havuzu yazıyorsunuz), ancak 512 İş Parçacığının tümü birkaç saniye içinde çalışacak, Görevler ve .NET ThreadPool iş parçacıklarının başlaması birkaç dakika sürecek.
Aşağıda, her 30 saniyenin çalışması için verilen böyle bir testin (16 GB RAM'li i5 dört çekirdekli) sonuçları verilmiştir. Yürütülen kod, bir SSD sürücüsünde basit dosya G / Ç gerçekleştirir.
Test sonuçları