มันเป็นสิ่งสำคัญสำหรับการแก้ปัญหาที่จะมีประสิทธิภาพหรือไม่?


9

ฉันแก้ปัญหามากมายโดยส่วนใหญ่มาจาก Top Coder ฉันจะได้คำตอบสำหรับหลาย ๆ คน แต่ส่วนใหญ่ฉันจะได้คำตอบที่ไม่มีประสิทธิภาพ

ในการใช้งานจริง - มันสำคัญหรือไม่ที่ทางออกของปัญหานั้นมีประสิทธิภาพ? ถ้าเป็นเช่นนั้นฉันจะปรับปรุงได้อย่างไร


4
คุณถามจากมุมมองการแข่งขันหรือมุมมองการใช้งานจริงหรือไม่?
rjzii

@RobZ: ในการใช้งานจริง
Ant ของ

1
"โลกแห่งความจริง" ครอบคลุมพื้นดินมากมาย ฝังตัว? แอปพลิเคชันเซิร์ฟเวอร์ แอปพลิเคชันมือถือ ซอฟต์แวร์คอมพิวเตอร์ส่วนบุคคลที่ผู้ใช้คนเดียว? การจำลองทางวิทยาศาสตร์? คำตอบนั้นไม่จำเป็นต้องเหมือนกันสำหรับพวกเขา
David Thornley

คำตอบ:


34

วิธีการแก้ปัญหาที่ดีที่สุดคือคนที่ (ในลำดับความสำคัญที่เพิ่มขึ้น) มีประสิทธิภาพในการบำรุงรักษาและการดำเนินการเสร็จแล้ว

^^^ นั่นคือสิ่งเดียวที่คุณต้องการจากคำตอบนี้ ^^^

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

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


3
ได้. และโปรแกรมที่ไม่มีประสิทธิภาพอย่างมากที่ถูกต้องและถูกต้องจะช่วยให้คุณทดสอบการปรับปรุงของคุณได้
Mike Catrill 'Cat Recall'

1
ส่วนที่สำคัญที่สุดคือการรู้วิธีปฏิบัติที่ดีที่สุดเพื่อประสิทธิภาพโดยเฉพาะอย่างยิ่งในการพัฒนาฐานข้อมูลที่ฉันจะนำไปสู่ประสิทธิภาพที่เหนือกว่าการบำรุงรักษา ผู้ใช้ใส่ใจอย่างยิ่งเกี่ยวกับประสิทธิภาพ ฉันมักจะเห็นโค้ดที่มีประสิทธิภาพมากกว่าที่พูดถึงยากกว่าการรักษา แต่เพียงเพราะความล้มเหลวของนักพัฒนาในการทำความเข้าใจโค้ดที่มีประสิทธิภาพมากขึ้นในการเริ่มต้นเมื่อคุณคุ้นเคยกับ techinques แล้วคุณไปที่ techiniques เหล่านั้นเป็นตัวเลือกแรก และพวกเขาจะดูแลได้ง่ายขึ้นเพราะคุณเข้าใจว่าทำไมพวกเขาถึงทำงาน
HLGEM

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

8

ฉันเห็นด้วยกับ Mike Cellini สิ่งหนึ่งที่ฉันเพิ่มคือ

บางสิ่งบางอย่าง "มีประสิทธิภาพเพียงพอ" หรือไม่? ตัวอย่างเช่นจากมุมมองของผู้ใช้ไม่มีความแตกต่างระหว่างฟังก์ชั่นที่เสร็จสมบูรณ์ใน 0.00001 วินาทีหรือหนึ่งที่เสร็จสมบูรณ์ใน 0.1 วินาทีแม้ว่าจะมีประสิทธิภาพมากกว่าอีก ฟังก์ชั่นที่เสร็จสมบูรณ์ภายใน 10 นาทีนั้นไม่แตกต่างกันมากนัก (สำหรับผู้ใช้) กับฟังก์ชันที่ทำใน 12 นาที ในทั้งสองกรณีผู้ใช้จะได้รับกาแฟหนึ่งแก้วหรือทำงานอื่นต่อ

ฉันได้เห็นประสิทธิภาพในฐานะ "ผู้ใช้ที่มีประสิทธิภาพ" ไม่ใช่อัลกอริทึมที่มีประสิทธิภาพ


กฎง่ายๆที่ฉันได้ยินคือผู้ใช้สามารถสังเกตเห็นการปรับปรุง 20% ทั้งคู่ดูเหมือนว่าจะมีคุณสมบัติฉันคิดว่าผู้ใช้จะรู้สึกถึงความแตกต่างในการตอบสนองระหว่าง. 1 ถึง .00001 วินาที
Chris Pitman

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

2

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

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

  • นักเรียนบางคนใช้การวนรอบอย่างง่ายและสูตรที่เตรียมไว้เพื่อตรวจสอบเพื่อให้แน่ใจว่าตัวเลขถูกต้องและแสดงพวกเขาช้า แต่ทำงานเสร็จแล้ว O (n ^ 3)
  • นักเรียนคนอื่นทำการวิจัยและพบสูตรที่ทำงานได้ดีกว่าในการตรวจสอบเพื่อให้แน่ใจว่าหมายเลขที่ระบุนั้นถูกต้องโปรแกรมเหล่านี้ทำงานได้เร็วขึ้นมาก O (n ^ 2)
  • นักเรียนคนหนึ่งใช้สูตรช้าเพื่อสร้างค่าจากนั้นคัดลอกลงในอาร์เรย์คงที่ในรหัสและแสดงเนื้อหาของ O (n)

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

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

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


2

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

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

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

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

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


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

ไม่ฉันเพิ่งระบุรายการแรกที่ฉันพบใน Amazon และไม่ได้สนใจการตรวจสอบว่าเป็นรุ่นที่สอง
Daniel Pittman

1

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

  1. หากคุณเป็นผู้ใช้คนเดียวของบล็อกโค้ดและมันใช้งานได้ดีสำหรับคุณคุณอาจไม่เป็นไร
  2. หากโปรแกรมของคุณกำลังจะขายคุณต้องมีแพลตฟอร์มเป้าหมายอยู่ในใจ ทดสอบด้วยแพลตฟอร์มนี้ หากโปรแกรมช้าเป็นพิเศษคุณต้องพยายามทำให้มีประสิทธิภาพมากขึ้น หากคุณรู้สึกดีคุณควรมอบให้กับผู้ใช้รายอื่นและดูว่าพวกเขาเห็นด้วยหรือไม่
  3. บางทีโปรแกรมอาจมีข้อควรพิจารณาอื่น ๆ หากคุณกำลังสร้างโปรแกรมที่ใช้เซิร์ฟเวอร์คุณอาจต้องทำงานอย่างหนักเพื่อให้โปรแกรมมีประสิทธิภาพมากที่สุด หรือถ้ามันทำงานบนไมโครโปรเซสเซอร์ตรวจสอบให้แน่ใจว่ามันทำงานได้ดีเช่นกัน

วิธีทำให้โค้ดของคุณมีประสิทธิภาพมากขึ้น:

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

มีทั้งฟิลด์เพื่อเพิ่มประสิทธิภาพ แต่อย่างน้อยสองเคล็ดลับข้างต้นควรเริ่มต้นให้คุณ


1

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

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.