เพื่อให้ได้ประสิทธิภาพสูงสุดพร้อมกับยูนิตที่ดำเนินการพร้อมกันให้เขียนเธรดพูลของคุณเองโดยที่พูลของอ็อบเจ็กต์เธรดถูกสร้างขึ้นเมื่อเริ่มต้นระบบและไปที่การบล็อก (ก่อนหน้านี้ถูกระงับ) รอให้บริบททำงาน (อ็อบเจ็กต์ที่มีอินเทอร์เฟซมาตรฐานที่ดำเนินการโดย รหัสของคุณ)
บทความมากมายเกี่ยวกับ Tasks vs. Threads เทียบกับ. NET ThreadPool ไม่สามารถให้สิ่งที่คุณต้องการในการตัดสินใจเรื่องประสิทธิภาพได้ แต่เมื่อคุณเปรียบเทียบพวกเขา Threads จะชนะและโดยเฉพาะกลุ่มของ Threads มีการกระจายสิ่งที่ดีที่สุดในซีพียูและเริ่มต้นได้เร็วขึ้น
สิ่งที่ควรกล่าวถึงคือความจริงที่ว่าหน่วยประมวลผลหลักของ Windows (รวมถึง Windows 10) เป็นเธรดและค่าใช้จ่ายในการสลับบริบทของระบบปฏิบัติการมักจะไม่สำคัญ พูดง่ายๆว่าฉันไม่สามารถหาหลักฐานที่น่าเชื่อถือของบทความเหล่านี้จำนวนมากไม่ว่าบทความจะอ้างว่ามีประสิทธิภาพสูงขึ้นโดยการบันทึกการสลับบริบทหรือการใช้งาน CPU ที่ดีขึ้น
ตอนนี้เพื่อความสมจริง:
พวกเราส่วนใหญ่ไม่ต้องการให้แอปพลิเคชันของเราถูกกำหนดและพวกเราส่วนใหญ่ไม่มีพื้นหลังที่ยากลำบากด้วยเธรดซึ่งมักมาพร้อมกับการพัฒนาระบบปฏิบัติการ สิ่งที่ฉันเขียนไว้ข้างต้นไม่ใช่สำหรับผู้เริ่มต้น
ดังนั้นสิ่งที่สำคัญที่สุดคือการพูดคุยกันคือสิ่งที่ง่ายต่อการเขียนโปรแกรม
หากคุณสร้างเธรดพูลของคุณเองคุณจะมีงานเขียนเล็กน้อยที่ต้องทำเนื่องจากคุณจะต้องเกี่ยวข้องกับการติดตามสถานะการดำเนินการวิธีจำลองการระงับและดำเนินการต่อและวิธีการยกเลิกการดำเนินการรวมทั้งในแอปพลิเคชัน ปิดตัวลง. คุณอาจต้องกังวลด้วยว่าคุณต้องการขยายสระว่ายน้ำแบบไดนามิกหรือไม่และพูลของคุณจะมีขีดจำกัดความสามารถเท่าใด ฉันสามารถเขียนกรอบดังกล่าวได้ภายในหนึ่งชั่วโมง แต่นั่นเป็นเพราะฉันทำมาหลายครั้งแล้ว
บางทีวิธีที่ง่ายที่สุดในการเขียนหน่วยประมวลผลคือการใช้งาน ความสวยงามของงานคือคุณสามารถสร้างขึ้นมาใหม่และเริ่มใช้งานในบรรทัดในโค้ดของคุณ (แม้ว่าอาจมีการรับประกันข้อควรระวัง) คุณสามารถส่งโทเค็นการยกเลิกเพื่อจัดการเมื่อคุณต้องการยกเลิกงาน นอกจากนี้ยังใช้วิธีการสัญญาในการผูกมัดเหตุการณ์และคุณสามารถส่งคืนค่าบางประเภทได้ ยิ่งไปกว่านั้นด้วยการ async และรอมีตัวเลือกมากขึ้นและรหัสของคุณจะพกพาได้มากขึ้น
โดยพื้นฐานแล้วสิ่งสำคัญคือต้องเข้าใจข้อดีข้อเสียของ Tasks vs. Threads เทียบกับ. NET ThreadPool ถ้าฉันต้องการประสิทธิภาพสูงฉันจะใช้เธรดและฉันชอบใช้พูลของฉันเอง
วิธีง่ายๆในการเปรียบเทียบคือเริ่มต้น 512 เธรด 512 งานและ 512 เธรดพูล คุณจะพบความล่าช้าในการเริ่มต้นด้วยเธรด (ด้วยเหตุนี้ทำไมจึงต้องเขียนเธรดพูล) แต่ 512 เธรดทั้งหมดจะทำงานในไม่กี่วินาทีในขณะที่เธรด Tasks และ. NET ThreadPool ใช้เวลาไม่กี่นาทีในการเริ่มต้นทั้งหมด
ด้านล่างนี้เป็นผลการทดสอบดังกล่าว (i5 quad core พร้อม RAM 16 GB) โดยให้เวลาในการรันทุกๆ 30 วินาที รหัสที่เรียกใช้ดำเนินการกับไฟล์ I / O อย่างง่ายบนไดรฟ์ SSD
ผลการทดสอบ