ซอฟต์แวร์ทางวิทยาศาสตร์ควรได้รับการปรับให้เหมาะสมเท่าใด


13

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

นักพัฒนาซอฟต์แวร์ควรลงทุนเวลาและความพยายามในการปรับแต่งแอปพลิเคชั่นให้เหมาะสมเท่าไร? เกณฑ์หลักที่ใช้มีอะไรบ้าง?


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

คำตอบ:


15

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

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

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


1
เมื่อเร็ว ๆ นี้ฉันได้รับการปรับปรุง 10,000 (สำหรับเหตุการณ์ที่ยิ่งใหญ่ที่สุดของเรา) ในระยะเวลา จำกัด ของการวิเคราะห์ของเราเพียงแค่เปลี่ยนอัลกอริทึมที่เป็น O (n ^ 2) ในเวลาและสถานที่ด้วย O (n log n) ) ทั้งใน คุณคิดว่ามันหมายถึงการพึ่งพาอาศัยกันและมีความซับซ้อนเพิ่มขึ้น แต่บางครั้งมันก็คุ้มค่า ...
dmckee --- อดีตผู้ดูแลลูกแมว

1
ปัจจัยเร่งความเร็ว (ซึ่งสัมพันธ์กับบางสิ่ง) ไม่คุ้มค่ากับการอ้างอิงที่ชัดเจนกับสิ่งที่คุณเปรียบเทียบ หากคุณเปรียบเทียบกับการติดตั้งที่ไม่ดีตามอัลกอริธึมที่ไม่เหมาะสมและจากนั้นการเปลี่ยนแปลงจะเห็นได้ชัดว่าไม่มีเหตุผลอันสมควรที่จะได้รับผลประโยชน์จำนวนมาก
Allan P. Engsig-Karup

1
@ อัลลัน: มี 10,000 ปัจจัยที่จะได้รับจากการเปลี่ยนแปลงเดียวแล้วเห็นได้ชัดว่ามันเป็นการดำเนินงานที่ไม่ได้รับการแต่งตั้ง รหัสก่อนหน้าได้รับบาดเจ็บมากจากพื้นที่ที่ไม่จำเป็นเช่นเดียวกับความซับซ้อนของเวลา: ประสิทธิภาพในการแคชนั้นสุดซึ้ง แต่นั่นคือประเด็นไม่ใช่หรือ
dmckee --- ผู้ดูแลอดีตลูกแมว

8

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

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

  • หากคุณรู้ว่าสถาปัตยกรรมของคุณรองรับ SIMD ให้ปรับโครงสร้างการคำนวณใหม่เพื่อให้การทำงานของคุณสามารถเขียนในรูปแบบเวกเตอร์สั้น ๆ
  • หากคุณรู้ว่าสถาปัตยกรรมเป็นคอมพิวเตอร์แบบมัลติคอร์ลองแบ่งงานการคำนวณของคุณออกเป็นงานย่อยแต่ละงานที่ไม่รบกวนซึ่งกันและกันและทำงานในแบบขนาน (คิดว่า DAG สำหรับงานย่อยของคุณ) ,
  • หากสถาปัตยกรรมพื้นฐานของคุณมี GPU ให้นึกถึงวิธีที่คุณสามารถกำหนดสูตรการคำนวณของคุณใหม่เป็นกลุ่มของกระทู้ที่เดินผ่านข้อมูลในขั้นตอนล็อค
  • ฯลฯ ...

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


4

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

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

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


4

คุณจะต้องทำการวิเคราะห์ (ค่าใช้จ่าย) ของการใช้จ่ายหลาย ๆ เดือน (และเหล่านั้นมักจะเป็นตำนาน :-)) ในการเพิ่มความเร็วในการดำเนินการ คุณจะต้องคิดออกว่าจะใช้ซอฟต์แวร์ชิ้นนี้กี่ครั้งและมีคนกี่คนที่คุณจะได้ประมาณ

กฎของหัวแม่มือเช่นเคยเป็นกฎ 80/20 ที่มีชื่อเสียง ในบางขณะมันก็ไม่ได้เพิ่มขึ้นอีกต่อไปที่จะใช้เวลามากขึ้นในการได้รับร้อยละของเวลาทำงาน (หรือน้อยกว่า) แต่คุณจะต้องวิเคราะห์

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

หากต้องการอ้างอิง Donald Knuth: "การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด" ดังนั้นโปรไฟล์รหัสของคุณ แต่ไม่เร็วเกินไป


คุณอ้างถึงกฎ Pareto Principle (80/20) หรือไม่? ถ้าเป็นเช่นนั้นคุณหมายความว่าเราควรมุ่งเน้นการเพิ่มประสิทธิภาพให้กับโค้ด 20% ที่ผลิต 80% ของการชะลอตัวหรือไม่ หรือคุณหมายถึงว่าถ้าคุณคาดหวังว่าจะได้ความเร็วเพิ่มขึ้นเพียง 20% มันก็ไม่คุ้มที่จะเพิ่มประสิทธิภาพ
เปาโล

ไม่ฉันใช้มันเป็นหลักการเท่านั้นไม่ใช่อย่างแน่นอน 80/20 ในบางเวลาคุณจะใช้ความพยายามอย่างมากในการได้รับเพียงไม่กี่เปอร์เซ็นต์ซึ่งไม่คุ้มกับความพยายามอีกต่อไป
GertVdE

3

คำแนะนำเพิ่มเติมบางส่วน:

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