ฉันจะรู้ได้อย่างไรว่าฉันใช้มัลติเธรดมากเกินไป?


15

ตอนนี้ฉันรู้สึกว่าฉันใช้งานมัลติเธรดมากเกินไป

ฉันมีข้อมูล 3 ประเภทคือ A, B และ C

แต่ละคนAสามารถแปลงเป็นหลายBs และแต่ละคนBสามารถแปลงเป็นหลายCs

ฉันสนใจเพียงแค่รักษาCs

ฉันสามารถเขียนได้อย่างง่ายดายด้วยฟังก์ชันแปลงสองอย่าง แต่ผมจับตัวเองดำเนินการกับกระทู้, สามคิว ( queue_a, queue_bและqueue_c) มีสองเธรดที่ทำการแปลงต่างกันและผู้ปฏิบัติงานหนึ่งคน:

  • ConverterAอ่านจากqueue_aและเขียนถึงqueue_b
  • ConverterBอ่านจากqueue_bและเขียนถึงqueue_c
  • Worker จัดการแต่ละองค์ประกอบจาก queue_c

การแปลงค่อนข้างธรรมดาและฉันไม่รู้ว่ารุ่นนี้ซับซ้อนเกินไปหรือไม่ แต่ดูเหมือนว่าแข็งแกร่งสำหรับฉันมาก "ตัวแปลง" แต่ละตัวสามารถเริ่มทำงานได้ก่อนที่ข้อมูลจะมาถึงคิวและเมื่อใดก็ตามในรหัสที่ฉันสามารถ "ส่ง" ใหม่AหรือBs และมันจะทริกเกอร์ไปป์ไลน์การแปลงซึ่งจะเรียกใช้งานโดยคนงาน เกลียว.

แม้แต่รหัสผลลัพธ์ก็ดูเรียบง่ายขึ้น แต่ฉันก็ยังไม่แน่ใจว่าฉันใช้เธรดอย่างไม่เหมาะสมหรือไม่


5
ฉันคิดว่าคำถามนี้จะต้องสั้นลงเล็กน้อยเพื่อตัดการไล่ล่า ชื่อเรื่องนั้นก็ทำให้เข้าใจผิดด้วย - ดูเหมือนว่าคุณกำลังจะกลายเป็นคนคุยโว (แม้ว่าคุณจะไม่ได้) บางทีคุณควรถามบางสิ่งบางอย่างใกล้ชิดกับ "ฉันจะบอกได้อย่างไรว่าฉันใช้มัลติเธรดมากเกินไป?"
KChaloux

@KChaloux ฉันเห็นด้วย ฉันแก้ไขมันและหวังว่ามันจะเก็บความคิดของฉันได้ดีขึ้น
exhuma

4
@exhuma ยอดเยี่ยม -1 ของคุณจะกลายเป็น +1
KChaloux

3
@KChaloux ... ความแตกต่างระหว่างการเยี่ยมชม loo นั้นสามารถทำให้กระบวนการคิดของคุณ ... :)
exhuma

หนังสือ PDF ออนไลน์เล่มนี้คู่มือการเพิ่มประสิทธิภาพแบบผู้ใหญ่ (เพิ่งเผยแพร่เมื่อวันที่ผ่านมา) พูดถึงผลกระทบที่เป็นระบบซึ่งบางครั้งผลกระทบของโมดูลต่อประสิทธิภาพโดยรวมของระบบอาจเกินเวลาของการดำเนินการของโมดูล

คำตอบ:


17

เป็นเรื่องง่ายกว่าที่จะคิดตามลำดับและจากนั้นปรับเปลี่ยนตรรกะนั้นในภายหลังเพื่อให้ทำงานได้ดีขึ้นโดยใช้เธรด และตามที่นิพจน์ใช้ "ถ้ามันไม่พังอย่าแก้ไขเลย" โปรแกรมเมอร์ส่วนใหญ่ไม่ใช้เธรดเพียงเพราะไม่จำเป็นต้องใช้เธรด

หากคุณรู้สึกสะดวกสบายในการใช้มันให้เพิ่มพลังให้กับคุณ อย่างไรก็ตามทราบว่าหากเธรดไม่ได้เพิ่มความเร็วโดยการกำจัดคอขวดพวกเขาเกือบจะทำให้โปรแกรมของคุณช้าลงอย่างแน่นอน

นอกจากนี้ให้พิจารณาว่าระบบที่ใช้ CPU เพียงตัวเดียวในการประมวลผลจะจำลองหลายเธรดโดยเธรดเดียวเพื่อประหยัดทรัพยากร (สิ่งนี้ไม่ได้เกิดขึ้นบ่อยครั้งกับคอมพิวเตอร์ที่ทันสมัยแม้ว่าแอพพลิเคชั่นสมาร์ทโฟนนั้น ในกรณีนี้แม้ว่าคุณจะกำจัดคอขวดผ่านการใช้เธรดจริงๆแล้วมันจะช้ากว่าการที่คุณไม่ได้ใช้เธรดเลย

และอาจเป็นเหตุผลที่ละเอียดอ่อนที่สุดในการใช้ความระมัดระวังในการใช้เธรด แต่แน่นอนไม่สำคัญที่สุดเธรดมีแนวโน้มที่จะทำสิ่งที่คุณไม่คาดหวัง ใช่ถ้าคุณระมัดระวังตัวเองคุณก็โอเค ใช่ถ้าเธรดของคุณไม่ได้เขียนถึงตัวแปรที่แชร์ระหว่างเธรดคุณควรจะโอเค ที่กล่าวว่าข้อบกพร่องที่เกี่ยวข้องกับเธรดหายากมาก เนื่องจากฉันมีความคิดว่าโปรแกรมเมอร์ไม่สามารถกำจัดความเป็นไปได้ในการสร้างบั๊กในโค้ดได้อย่างสมบูรณ์ดังนั้นโปรแกรมเมอร์จึงควรใช้มาตรการในการป้องกันข้อผิดพลาดที่อาจเกิดขึ้นแทนที่จะมุ่งเน้นไปที่การกำจัดพวกเขาทั้งหมด เพื่อค้นหาข้อบกพร่องของเธรดเช่นกัน ในคำอื่น ๆ รู้ว่าแม้จะมีความพยายามอย่างที่สุดของคุณ

ดังนั้นคุณควรใช้เธรดหรือไม่ ความรู้ที่ดีต่อสุขภาพของกระทู้ไม่ใช่เรื่องเลวร้ายโดยเฉพาะอย่างยิ่งถ้าคุณเก่งในเรื่องนี้ อย่างไรก็ตามการเคลื่อนที่ของปลายนั้นมีต่อภาษาที่มีเธรดเดียวเช่น node.js หนึ่งในข้อดีหลักของการมีเธรดเดียวคือมันง่ายต่อการปรับขนาดและการเพิ่มประสิทธิภาพบางอย่างสามารถทำได้ถ้าคุณรู้ว่าคำแนะนำที่คาดว่าจะทำงานตามลำดับ (แม้ว่าการเพิ่มประสิทธิภาพอาจหมายถึงคำแนะนำที่สามารถทำงานแบบขนานได้ เรียกใช้แบบอะซิงโครนัส)

ที่กล่าวว่าฉันพูดทำสิ่งที่สบายที่สุดสำหรับคุณ จากประสบการณ์ของฉันการเขียนโปรแกรมที่คุณเข้าใจมีความสำคัญสูงกว่าทำให้การทำงานเร็วขึ้น อย่าลืมใช้เธรดเมื่อคุณคิดว่ามันช่วยให้คุณเขียนโปรแกรมและไม่ใช่เพราะคุณต้องการให้มันทำงานได้เร็วขึ้นเนื่องจากคุณไม่ควรกังวลมากเกี่ยวกับประสิทธิภาพในขณะที่คุณกำลังเขียนโปรแกรม (การปรับให้เหมาะสมเป็นสิ่งสำคัญ สามารถรอได้)


คุณกำลังทำคะแนนที่น่าสนใจ ในกรณีของฉันไปป์ไลน์การแปลงที่ไม่เกี่ยวกับประสิทธิภาพ มันเกี่ยวกับความเรียบง่ายของรหัส / ความสามารถในการอ่าน ด้ายคนงานเป็นเกี่ยวกับประสิทธิภาพ แต่ละงานสุดท้ายทำงานบนเครื่องระยะไกลและการส่งงานหลายงานทำให้ทำงานได้เร็วขึ้นอย่างมีนัยสำคัญ
exhuma

2
@ exhuma นอกจากการดำเนินการแบบขนานผ่านหลายเธรดคุณยังสามารถใช้เทคนิค async เช่น Futures / Promises หรือสไตล์การโทรกลับ โปรดทราบว่าคุณสามารถสร้างแบบจำลองท่อส่งโดยการโยงตัววนซ้ำ / สตรีม ไม่จำเป็นต้องใช้เธรดจริง ๆ ยกเว้นในกรณีที่คุณต้องการใช้ซีพียูหลายตัว (ในรหัสเครือข่ายกรณีนี้แทบไม่เคยเกิดขึ้นเลย)
อมร

@ exhuma ใช่แล้วหัวข้อช่วยเหลือเกี่ยวกับประสิทธิภาพโดยทั่วไป ประเด็นของฉันคือถ้าคุณไม่ทำเพราะช้าเกินไปคุณควรทำเพราะช่วยให้คุณเขียนโปรแกรม การเพิ่มประสิทธิภาพควรมาในภายหลัง อาจเป็นไปได้ว่าการลบเธรดออกจากโปรแกรมของคุณกำลังปรับให้เหมาะสม (แม้ว่าจะไม่ใช่กรณีสำหรับโปรแกรมเมอร์ส่วนใหญ่)
Neil

OT: ฉันรักสัญลักษณ์ของคุณ ทำให้ฉันยิ้ม.
Marjan Venema

@ exhuma ฉันเห็นด้วยกับคำตอบนี้ แต่ฉันจะเพิ่มว่าถ้าคุณจะใช้เธรดสำหรับความเรียบง่ายของรหัสที่ดี แต่ระวังให้มากที่คุณเข้าใจความปลอดภัยของเธรดและ gotchas อาจมีหลายกระทู้ สิ่งที่อาจดูเหมือนรหัส multithreaded ที่เรียบง่ายอาจมีเงื่อนไขการแข่งขันที่ซ่อนเร้นซึ่งอาจนำไปสู่การจัดประเภทของข้อบกพร่องที่ยากต่อการติดตาม
เบ็นหลี
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.