แนวทางแบบอะซิงโครนัสของ Microsoft เป็นสิ่งทดแทนที่ดีสำหรับวัตถุประสงค์ทั่วไปสำหรับการเขียนโปรแกรมแบบมัลติเธรด: ปรับปรุงการตอบสนองตามภารกิจ IO
อย่างไรก็ตามสิ่งสำคัญคือต้องตระหนักว่าวิธีการแบบอะซิงโครนัสนั้นไม่สามารถปรับปรุงประสิทธิภาพได้ทั้งหมดหรือปรับปรุงการตอบสนองสำหรับงานที่ต้องใช้ CPU มาก
มัลติเธรดสำหรับการตอบสนอง
มัลติเธรดสำหรับการตอบสนองเป็นวิธีดั้งเดิมในการตอบสนองของโปรแกรมในระหว่างงานหนัก IO หรืองานการคำนวณหนัก คุณบันทึกไฟล์บนเธรดพื้นหลังเพื่อให้ผู้ใช้สามารถทำงานต่อได้โดยไม่ต้องรอให้ฮาร์ดไดรฟ์ทำงานให้เสร็จ เธรด IO มักบล็อกรอส่วนหนึ่งของการเขียนจนเสร็จสิ้นดังนั้นการสลับบริบทจึงเกิดขึ้นบ่อยครั้ง
ในทำนองเดียวกันเมื่อทำการคำนวณที่ซับซ้อนคุณต้องการอนุญาตให้สลับบริบทเป็นประจำเพื่อให้ UI สามารถตอบสนองได้และผู้ใช้ไม่คิดว่าโปรแกรมจะทำงานล้มเหลว
โดยทั่วไปเป้าหมายที่นี่ไม่ใช่เพื่อให้หลายเธรดสามารถทำงานบน CPU ที่แตกต่างกัน แต่เราเพียงแค่ต้องการให้การสลับบริบทเกิดขึ้นระหว่างงานเบื้องหลังที่ยาวนานและ UI เพื่อให้ UI สามารถอัปเดตและตอบสนองต่อผู้ใช้ในขณะที่งานเบื้องหลังทำงานอยู่ โดยทั่วไป UI จะไม่ใช้พลังงาน CPU มากนักและกรอบการทำงานเธรดหรือระบบปฏิบัติการโดยทั่วไปจะตัดสินใจที่จะเรียกใช้บน CPU เดียวกัน
เราสูญเสียประสิทธิภาพโดยรวมเนื่องจากค่าใช้จ่ายเพิ่มเติมของการสลับบริบท แต่เราไม่สนใจเพราะประสิทธิภาพของ CPU ไม่ใช่เป้าหมายของเรา เรารู้ว่าเรามักจะมีพลังของ CPU มากกว่าที่เราต้องการและดังนั้นเป้าหมายของเราในการทำมัลติเธรดคือการทำงานให้กับผู้ใช้โดยไม่ต้องเสียเวลาของผู้ใช้
ทางเลือก "แบบอะซิงโครนัส"
"วิธีการแบบอะซิงโครนัส" เปลี่ยนรูปภาพนี้โดยการเปิดใช้งานการสลับบริบทภายในเธรดเดี่ยว สิ่งนี้รับประกันได้ว่างานของเราทั้งหมดจะทำงานบน CPU ตัวเดียวและอาจให้การปรับปรุงประสิทธิภาพเล็กน้อยในแง่ของการสร้าง / ล้างข้อมูลเธรดที่น้อยลงและการสลับบริบทจริงน้อยลงระหว่างเธรด
แทนที่จะสร้างเธรดใหม่เพื่อรอการรับทรัพยากรเครือข่าย (เช่นการดาวน์โหลดรูปภาพ) async
จะใช้วิธีการซึ่งawait
รูปภาพนั้นพร้อมใช้งานและในขณะเดียวกันให้วิธีการโทร
ข้อได้เปรียบหลักของที่นี่คือคุณไม่ต้องกังวลเกี่ยวกับปัญหาการทำเกลียวเช่นการหลีกเลี่ยงการหยุดชะงักเนื่องจากคุณไม่ได้ใช้การล็อกและการซิงโครไนซ์เลยและมีการทำงานที่น้อยลงสำหรับโปรแกรมเมอร์ที่ติดตั้งเธรดพื้นหลัง บนเธรด UI เมื่อผลลัพธ์กลับมาเพื่ออัปเดต UI อย่างปลอดภัย
ฉันไม่ได้มองลึกลงไปในรายละเอียดทางเทคนิคมากนัก แต่ความประทับใจของฉันก็คือการจัดการการดาวน์โหลดด้วยกิจกรรม CPU ที่เบาเป็นครั้งคราวจะกลายเป็นงานที่ไม่ได้แยกเธรด แต่เป็นอะไรที่มากกว่างานในคิวเหตุการณ์ UI และเมื่อ การดาวน์โหลดเสร็จสิ้นวิธีอะซิงโครนัสจะดำเนินการต่อจากคิวเหตุการณ์นั้น ในคำอื่น ๆawait
หมายถึงบางสิ่งบางอย่างที่คล้ายกันกับ "ตรวจสอบว่าผลลัพธ์ที่ฉันต้องการมีอยู่หรือไม่ถ้าไม่ให้ฉันกลับไปที่คิวงานของเธรดนี้"
โปรดทราบว่าวิธีการนี้จะไม่แก้ปัญหาของงานที่ใช้ CPU มาก: ไม่มีข้อมูลรอดังนั้นเราจึงไม่สามารถรับการสลับบริบทที่เราจำเป็นต้องเกิดขึ้นได้โดยไม่ต้องสร้างเธรดผู้ปฏิบัติงานพื้นหลังจริง แน่นอนว่ามันอาจยังสะดวกในการใช้วิธีการแบบอะซิงโครนัสเพื่อเริ่มเธรดพื้นหลังและส่งคืนผลลัพธ์ในโปรแกรมที่ใช้วิธีแบบอะซิงโครนัสอย่างแพร่หลาย
มัลติเธรดเพื่อประสิทธิภาพ
เมื่อคุณพูดถึง "ประสิทธิภาพ" ฉันก็อยากจะพูดคุยว่ามัลติเธรดสามารถใช้เพื่อเพิ่มประสิทธิภาพได้อย่างไรสิ่งที่เป็นไปไม่ได้เลยด้วยวิธีแบบอะซิงโครนัสแบบเธรดเดียว
เมื่อคุณอยู่ในสถานการณ์ที่คุณมีพลังงาน CPU ไม่เพียงพอใน CPU เดียวและต้องการใช้มัลติเธรดเพื่อประสิทธิภาพมักจะยากที่จะทำ ในทางกลับกันหาก CPU ตัวใดตัวหนึ่งมีกำลังการประมวลผลไม่เพียงพอก็มักจะเป็นทางออกเดียวที่ทำให้โปรแกรมของคุณสามารถทำสิ่งที่คุณต้องการให้สำเร็จในกรอบเวลาที่เหมาะสมซึ่งเป็นสิ่งที่ทำให้การทำงานคุ้มค่า
Parialism เล็กน้อย
แน่นอนว่าบางครั้งมันอาจเป็นเรื่องง่ายที่จะได้รับการเร่งความเร็วที่แท้จริงจากการมัลติเธรด
หากคุณมีงานเร่งรัดการคำนวณที่เป็นอิสระจำนวนมาก (นั่นคืองานที่มีข้อมูลเข้าและส่งออกมีขนาดเล็กมากเมื่อเทียบกับการคำนวณที่ต้องดำเนินการเพื่อกำหนดผลลัพธ์) จากนั้นคุณสามารถเร่งความเร็วได้อย่างมีนัยสำคัญโดย การสร้างกลุ่มของเธรด (ขนาดเหมาะสมตามจำนวนของ CPU ที่มีอยู่) และให้เธรดหลักกระจายงานและรวบรวมผลลัพธ์
การใช้มัลติเธรดเพื่อประสิทธิภาพ
ฉันไม่ต้องการให้ตัวเองเป็นผู้เชี่ยวชาญมากเกินไป แต่ความประทับใจของฉันก็คือโดยทั่วไปแล้วการใช้งานแบบมัลติเธรดสำหรับการปฏิบัติงานที่เกิดขึ้นในทุกวันนี้กำลังมองหาสถานที่ในแอปพลิเคชั่นที่มีความเท่าเทียมกันเล็กน้อย เพื่อเก็บเกี่ยวผลประโยชน์
เช่นเดียวกับการเพิ่มประสิทธิภาพใด ๆ มักจะดีที่สุดในการปรับให้เหมาะสมหลังจากที่คุณได้ทำรายงานประสิทธิภาพของโปรแกรมของคุณและระบุฮอตสปอต: มันง่ายที่จะทำให้โปรแกรมช้าลงโดยการตัดสินใจโดยพลการว่าส่วนนี้ควรทำงานใน ก่อนอื่นให้พิจารณาว่าทั้งสองส่วนใช้เวลาส่วนสำคัญของ CPU หรือไม่
เธรดพิเศษหมายถึงค่าใช้จ่ายในการตั้งค่า / การฉีกขาดที่เพิ่มขึ้นและสวิตช์บริบทเพิ่มเติมหรือค่าใช้จ่ายการสื่อสารระหว่าง CPU มากขึ้น หากการทำงานไม่เพียงพอที่จะชดเชยค่าใช้จ่ายเหล่านั้นหากใช้ CPU แยกต่างหากและไม่จำเป็นต้องใช้เธรดแยกต่างหากสำหรับเหตุผลการตอบสนองมันจะทำให้สิ่งต่าง ๆ ช้าลงโดยไม่มีประโยชน์
ค้นหางานที่มีการพึ่งพาซึ่งกันและกันน้อยและนั่นเป็นการเพิ่มส่วนสำคัญของรันไทม์ของโปรแกรมของคุณ
หากพวกเขาไม่มีการพึ่งพาซึ่งกันและกันมันเป็นเรื่องของการขนานกันเล็กน้อยคุณสามารถตั้งค่าแต่ละเธรดได้อย่างง่ายดายและเพลิดเพลินไปกับผลประโยชน์
หากคุณสามารถหางานที่มีการพึ่งพาซึ่งกันและกัน จำกัด เพื่อให้การล็อกและการซิงโครไนซ์เพื่อแลกเปลี่ยนข้อมูลไม่ได้ช้าลงอย่างมีนัยสำคัญมัลติเธรดสามารถเพิ่มความเร็วได้หากคุณระมัดระวังเพื่อหลีกเลี่ยงอันตรายจากการหยุดชะงักเนื่องจากตรรกะผิดพลาด ผลลัพธ์ไม่ถูกต้องเนื่องจากไม่ซิงโครไนซ์เมื่อจำเป็น
อีกวิธีหนึ่งแอพพลิเคชั่นที่ใช้กันทั่วไปสำหรับมัลติเธรดไม่ได้มองหาการเร่งอัลกอริธึมที่กำหนดไว้ล่วงหน้า แต่สำหรับงบประมาณที่มากกว่าสำหรับอัลกอริทึมที่พวกเขาวางแผนจะเขียน: หากคุณกำลังเขียนเอ็นจิ้นเกม และ AI ของคุณจะต้องตัดสินใจภายในอัตราเฟรมของคุณคุณมักจะให้ AI ของคุณรอบงบประมาณ CPU ที่ใหญ่กว่าถ้าคุณสามารถให้ CPU ของตัวเอง
อย่างไรก็ตามให้แน่ใจว่าได้ทำการโพรไฟล์เธรดและตรวจสอบให้แน่ใจว่าพวกเขาทำงานเพียงพอที่จะชดเชยค่าใช้จ่ายในบางจุด
อัลกอริทึมแบบขนาน
นอกจากนี้ยังมีปัญหามากมายที่สามารถเร่งความเร็วโดยใช้ตัวประมวลผลหลายตัว แต่มันก็ใหญ่เกินไปที่จะแยกระหว่างซีพียู
อัลกอริทึมแบบขนานจะต้องมีการวิเคราะห์อย่างรอบคอบสำหรับรันไทม์ขนาดใหญ่ของพวกเขาเกี่ยวกับอัลกอริทึมแบบไม่ขนานที่ดีที่สุดเนื่องจากมันง่ายมากสำหรับต้นทุนการสื่อสารระหว่างซีพียูเพื่อกำจัดผลประโยชน์ใด ๆ จากการใช้ CPU หลายตัว โดยทั่วไปพวกเขาจะต้องใช้การสื่อสารระหว่าง CPU น้อยกว่า (ในแง่ใหญ่ O) กว่าที่พวกเขาใช้การคำนวณในแต่ละ CPU
ในขณะนี้ยังคงมีพื้นที่ส่วนใหญ่สำหรับการวิจัยเชิงวิชาการส่วนหนึ่งเป็นเพราะต้องการการวิเคราะห์ที่ซับซ้อนส่วนหนึ่งเป็นเพราะความเท่าเทียมกันเล็กน้อยเป็นเรื่องธรรมดาส่วนหนึ่งเนื่องจากเรายังไม่มีคอร์ CPU จำนวนมากในคอมพิวเตอร์ของเราที่มีปัญหาซึ่ง ไม่สามารถแก้ไขได้ในกรอบเวลาที่สมเหตุสมผลบน CPU ตัวเดียวสามารถแก้ไขได้ในกรอบเวลาที่สมเหตุสมผลโดยใช้ CPU ทั้งหมดของเรา