Untuk kinerja tertinggi dengan unit pelaksana bersamaan, tulis kumpulan utas Anda sendiri, tempat kumpulan objek Thread dibuat saat start up dan buka pemblokiran (sebelumnya ditangguhkan), menunggu konteks untuk dijalankan (objek dengan antarmuka standar yang diterapkan oleh kode Anda).
Begitu banyak artikel tentang Tugas vs. Utas vs. .NET ThreadPool gagal memberi Anda apa yang Anda butuhkan untuk membuat keputusan untuk kinerja. Tetapi ketika Anda membandingkannya, Thread menang dan terutama sekelompok Thread. Mereka didistribusikan terbaik di seluruh CPU dan mereka memulai lebih cepat.
Apa yang harus didiskusikan adalah fakta bahwa unit eksekusi utama Windows (termasuk Windows 10) adalah utas, dan konteks OS yang mengganti overhead biasanya dapat diabaikan. Sederhananya, saya belum dapat menemukan bukti yang meyakinkan dari banyak artikel ini, apakah artikel tersebut mengklaim kinerja yang lebih tinggi dengan menghemat pengalihan konteks atau penggunaan CPU yang lebih baik.
Sekarang untuk sedikit realisme:
Sebagian besar dari kita tidak akan membutuhkan aplikasi kita untuk menjadi deterministik, dan kebanyakan dari kita tidak memiliki latar belakang yang sulit dengan benang, yang misalnya sering disertai dengan pengembangan sistem operasi. Apa yang saya tulis di atas bukan untuk pemula.
Jadi yang mungkin paling penting untuk didiskusikan adalah apa yang mudah diprogram.
Jika Anda membuat kumpulan utas sendiri, Anda akan memiliki sedikit penulisan yang harus dilakukan karena Anda harus khawatir dengan melacak status eksekusi, cara mensimulasikan penangguhan dan melanjutkan, dan bagaimana membatalkan eksekusi - termasuk dalam aplikasi-lebar mematikan. Anda mungkin juga harus khawatir dengan apakah Anda ingin secara dinamis menumbuhkan kolam Anda dan juga batasan kapasitas apa yang akan dimiliki kolam Anda. Saya dapat menulis kerangka kerja seperti itu dalam satu jam, tetapi itu karena saya telah melakukannya berkali-kali.
Mungkin cara termudah untuk menulis unit eksekusi adalah dengan menggunakan Tugas. Keindahan dari sebuah Tugas adalah bahwa Anda dapat membuat satu dan menendang itu di-line dalam kode Anda (meskipun hati-hati mungkin diperlukan). Anda dapat memberikan token pembatalan untuk ditangani saat Anda ingin membatalkan Tugas. Selain itu, ia menggunakan pendekatan janji untuk merantai acara, dan Anda dapat membuatnya mengembalikan jenis nilai tertentu. Selain itu, dengan async dan menunggu, lebih banyak opsi ada dan kode Anda akan lebih portabel.
Pada dasarnya, penting untuk memahami pro dan kontra dengan Tugas vs Threads vs .NET ThreadPool. Jika saya membutuhkan kinerja tinggi, saya akan menggunakan utas, dan saya lebih suka menggunakan kolam saya sendiri.
Cara mudah untuk membandingkan adalah memulai utas 512 Thread, 512 Tugas, dan utas 512 ThreadPool. Anda akan menemukan penundaan di awal dengan Utas (karenanya, mengapa menulis kumpulan utas), tetapi semua Utas 512 akan berjalan dalam beberapa detik sementara Tugas dan. Utas ThreadPool NET membutuhkan waktu hingga beberapa menit untuk memulai.
Di bawah ini adalah hasil dari tes semacam itu (i5 quad core dengan 16 GB RAM), memberikan setiap 30 detik untuk berjalan. Kode yang dieksekusi menjalankan file I / O sederhana pada drive SSD.
Hasil tes