คำถามติดแท็ก optimization

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

17
การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วทั้งหมดหรือไม่?
เพื่อนร่วมงานของฉันในวันนี้มุ่งมั่นที่เรียกว่าคลาสThreadLocalFormatซึ่งโดยทั่วไปจะย้ายอินสแตนซ์ของคลาส Java Format ลงในเธรดโลคัลเนื่องจากพวกเขาไม่ได้เป็นเธรดที่ปลอดภัยและ "ค่อนข้างแพง" ในการสร้าง ฉันเขียนการทดสอบอย่างรวดเร็วและคำนวณว่าฉันสามารถสร้างอินสแตนซ์ 200,000 ครั้งต่อวินาทีถามเขาว่าเขาสร้างสิ่งนั้นมากมายซึ่งเขาตอบว่า เขาเป็นโปรแกรมเมอร์ที่ยอดเยี่ยมและทุกคนในทีมมีทักษะสูงดังนั้นเราจึงไม่มีปัญหาในการทำความเข้าใจโค้ดผลลัพธ์ แต่ก็ชัดเจนว่าเป็นกรณีของการปรับให้เหมาะสมเมื่อไม่มีความต้องการจริง เขาสำรองรหัสตามคำขอของฉัน คุณคิดอย่างไร? นี่เป็นกรณีของ "การเพิ่มประสิทธิภาพก่อนวัยอันควร" หรือไม่และจริง ๆ แล้วมันแย่ขนาดไหน?

30
การเพิ่มประสิทธิภาพไมโครเป็นสิ่งสำคัญเมื่อการเข้ารหัส?
ฉันเพิ่งถามคำถามเกี่ยวกับกองมากเกินที่จะหาเหตุผลว่าทำไมisset () ได้เร็วกว่า strlen ()ในPHP สิ่งนี้ทำให้เกิดคำถามเกี่ยวกับความสำคัญของโค้ดที่อ่านได้และการปรับปรุงประสิทธิภาพของไมโครวินาทีในโค้ดนั้นคุ้มค่าหรือไม่ พ่อของฉันเป็นโปรแกรมเมอร์ที่เกษียณอายุราชการและฉันแสดงให้เขาเห็นคำตอบ เขามั่นใจอย่างแน่นอนว่าหาก coder ไม่ได้พิจารณาประสิทธิภาพในรหัสของพวกเขาแม้ในระดับไมโครพวกเขาไม่ใช่โปรแกรมเมอร์ที่ดี ฉันไม่แน่ใจ - บางทีความสามารถในการคำนวณที่เพิ่มขึ้นหมายความว่าเราไม่ต้องพิจารณาการปรับปรุงประสิทธิภาพแบบไมโครเหล่านี้อีกต่อไป? บางทีการพิจารณาแบบนี้ขึ้นอยู่กับคนที่เขียนรหัสภาษาจริง ๆ ? (ของ PHP ในกรณีข้างต้น) ปัจจัยด้านสิ่งแวดล้อมอาจมีความสำคัญ - อินเทอร์เน็ตใช้พลังงาน 10% ของพลังงานโลก ฉันสงสัยว่าโค้ดไมโครวินาทีที่สิ้นเปลืองเพียงใดเมื่อทำซ้ำล้านล้านครั้งบนเว็บไซต์หลายล้านแห่ง ฉันต้องการที่จะรู้คำตอบโดยเฉพาะอย่างยิ่งจากข้อเท็จจริงเกี่ยวกับการเขียนโปรแกรม การเพิ่มประสิทธิภาพไมโครเป็นสิ่งสำคัญเมื่อการเข้ารหัส? สรุปส่วนตัวของฉัน 25 คำตอบขอบคุณทุกคน บางครั้งเราจำเป็นต้องกังวลเกี่ยวกับการเพิ่มประสิทธิภาพแบบไมโคร แต่ในสถานการณ์ที่หายากมากเท่านั้น ความน่าเชื่อถือและความสามารถในการอ่านมีความสำคัญมากกว่าในกรณีส่วนใหญ่ อย่างไรก็ตามการพิจารณาการเพิ่มประสิทธิภาพแบบไมโครเป็นครั้งคราวไม่ได้ทำให้เจ็บปวด ความเข้าใจพื้นฐานสามารถช่วยเราไม่ให้เลือกสิ่งที่ไม่ดีอย่างเห็นได้ชัดเมื่อเขียนโค้ดเช่น if (expensiveFunction() || counter < X) ควรจะเป็น if (counter < X || expensiveFunction()) ( ตัวอย่างจาก …

20
การแทนที่รหัสที่ได้รับการปรับปรุงด้วยรหัสที่อ่านได้นั้นเป็นเรื่องปกติหรือไม่
บางครั้งคุณพบสถานการณ์ที่คุณต้องขยาย / ปรับปรุงบางรหัสที่มีอยู่ คุณจะเห็นว่ารหัสเก่านั้นผอมมาก แต่มันก็ยากที่จะขยายและใช้เวลาในการอ่าน มันเป็นความคิดที่ดีที่จะแทนที่ด้วยรหัสที่ทันสมัย? ก่อนหน้านี้ฉันชอบวิธีการแบบลีน แต่ตอนนี้ฉันคิดว่ามันจะดีกว่าถ้าเสียสละจำนวนมากเพื่อเพิ่มประสิทธิภาพให้กับ abstractions ที่สูงขึ้นอินเตอร์เฟสที่ดีขึ้นและโค้ดที่อ่านได้และสามารถขยายได้มากขึ้น คอมไพเลอร์ดูเหมือนว่าจะเริ่มดีขึ้นเช่นกันดังนั้นสิ่งต่าง ๆ เช่นstruct abc = {}กลายเป็นเงียบ ๆmemset, shared_ptrs ค่อนข้างผลิตรหัสเดียวกันเป็นตัวชี้ดิบ twiddling, แม่แบบทำงานได้ดีสุดเพราะพวกเขาผลิตรหัสซุปเปอร์ลีนและอื่น ๆ แต่ถึงกระนั้นบางครั้งคุณก็เห็นอาร์เรย์ตามสแต็กและฟังก์ชั่น C เก่าที่มีตรรกะคลุมเครือและมักจะไม่ได้อยู่ในเส้นทางที่สำคัญ เป็นความคิดที่ดีที่จะเปลี่ยนรหัสดังกล่าวถ้าคุณต้องสัมผัสชิ้นส่วนเล็ก ๆ ด้วยวิธีใด?

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

19
เหตุใดฉันจึงต้องใส่ใจเกี่ยวกับประสิทธิภาพของไมโครและประสิทธิภาพ?
คำถามและคำตอบมากมายในหน้า C / C ++ โดยเฉพาะหรือหารือเกี่ยวกับปัญหาประสิทธิภาพการทำงานของไมโคร (เช่นค่าใช้จ่ายของฟังก์ชั่น vs vs direct vs inline ทางอ้อม) หรือการใช้อัลกอริทึมO (N 2 ) vs O (N log N) รายการ 100 รายการ ฉันมักจะเขียนโค้ดโดยไม่ต้องกังวลเกี่ยวกับประสิทธิภาพของไมโครและความกังวลเล็กน้อยเกี่ยวกับประสิทธิภาพของมาโครโดยมุ่งเน้นที่การบำรุงรักษาที่ง่ายและเชื่อถือได้นอกจากว่าฉันรู้ว่าฉันมีปัญหา คำถามของฉันคือเหตุใดโปรแกรมเมอร์จำนวนมากจึงสนใจ? มันเป็นปัญหาสำหรับนักพัฒนาส่วนใหญ่จริง ๆ หรือไม่ฉันเพิ่งโชคดีพอที่จะไม่ต้องกังวลกับมันมากเกินไปหรือฉันเป็นโปรแกรมเมอร์ที่ไม่ดี?

9
ความหมายของกฎ 90/10 ของการเพิ่มประสิทธิภาพโปรแกรมคืออะไร
ตามวิกิพีเดียกฎ 90/10 ของการปรับโปรแกรมให้ดีที่สุดระบุว่า“ 90% ของเวลาดำเนินการโปรแกรมใช้ในการดำเนินการ 10% ของรหัส” (ดูย่อหน้าที่สองที่นี่ ) ฉันไม่เข้าใจสิ่งนี้จริงๆ สิ่งนี้หมายความว่าอย่างไร 90% ของเวลาในการดำเนินการสามารถใช้งานได้เพียง 10% ของรหัสเท่านั้น แล้วอีก 90% ของรหัสล่ะ? พวกเขาสามารถดำเนินการในเวลาเพียง 10% ได้อย่างไร

10
ทำความสะอาดโค้ดที่อ่านได้และโค้ดที่อ่านยากอย่างรวดเร็ว เมื่อไหร่ที่จะข้ามเส้น?
เมื่อฉันเขียนรหัสฉันพยายามทำให้รหัสของฉันสะอาดและอ่านง่ายที่สุดเท่าที่จะทำได้ ทุกครั้งที่มีเวลาที่คุณต้องข้ามเส้นและไปจากรหัสที่สะอาดดีเป็นรหัสที่น่าเกลียดเล็กน้อยเพื่อให้เร็วขึ้น เมื่อไรที่จะข้ามเส้นนั้น?

15
ภาษามีอิทธิพลต่อการออกแบบ CPU อย่างไร [ปิด]
เรามักจะบอกว่าฮาร์ดแวร์ไม่สนใจภาษาที่โปรแกรมเขียนเนื่องจากเห็นเฉพาะรหัสไบนารี่ที่คอมไพล์ แต่นี่ไม่ใช่ความจริงทั้งหมด ยกตัวอย่างเช่นพิจารณา Z80 ผู้ต่ำต้อย ส่วนขยายไปยังชุดคำสั่ง 8080 มีคำแนะนำเช่น CPIR ซึ่งจะเป็นประโยชน์สำหรับการสแกนแบบ C (NULL สิ้นสุด) strlen()สตริงเช่นการดำเนินการ ผู้ออกแบบจะต้องระบุว่าการรันโปรแกรม C (ตรงข้ามกับ Pascal ที่ความยาวของสตริงอยู่ในส่วนหัว) เป็นสิ่งที่การออกแบบของพวกเขาน่าจะใช้ อีกตัวอย่างที่คลาสสิกเป็นเครื่องเสียงกระเพื่อม มีตัวอย่างอะไรอีกบ้าง? เช่นคำแนะนำจำนวนและประเภทของการลงทะเบียนโหมดการกำหนดแอดเดรสที่ทำให้ตัวประมวลผลเฉพาะสนับสนุนหลักการของภาษาเฉพาะหรือไม่ ฉันสนใจเป็นพิเศษในการแก้ไขครอบครัวเดียวกัน

7
ในการเขียนโปรแกรมซอฟต์แวร์เป็นไปได้ไหมที่ทั้ง CPU และ GPU จะโหลด 100%?
นี่เป็นคำถามทั่วไปในเรื่องที่ฉันสนใจในฐานะนักเล่นเกม: คอขวดของ CPU / GPU และการเขียนโปรแกรม ถ้าฉันไม่เข้าใจผิดฉันจะเข้าใจว่าทั้ง CPU และ GPU คำนวณสิ่งของ แต่สิ่งหนึ่งนั้นดีกว่าในการคำนวณบางอย่างมากกว่าอีกอันหนึ่งเนื่องจากความแตกต่างของสถาปัตยกรรม ตัวอย่างเช่นการถอดรหัสแฮชหรือการขุด cryptocurrency ดูเหมือนจะมีประสิทธิภาพมากกว่าใน GPU มากกว่าใน CPU ดังนั้นฉันสงสัย: มี GPU ที่โหลด 100% ในขณะที่ CPU อยู่ที่ 50% (ตัวอย่าง) หลีกเลี่ยงไม่ได้? หรือแม่นยำยิ่งขึ้น: การคำนวณบางอย่างที่โดยปกติ GPU กระทำโดย CPU หากการคำนวณแรกนั้นมีการโหลด 100% ดังนั้นทั้งสองจะถึงการโหลด 100% หรือไม่ ฉันค้นหาเรื่องเล็กน้อย แต่กลับมาค่อนข้างถนัดมือ ฉันคิดและหวังว่าสิ่งนี้จะเกิดขึ้นในส่วนย่อยนี้และเปิดรับเอกสารหรือการบรรยายใด ๆ ที่คุณอาจให้ฉัน!

4
ไปได้เร็วแค่ไหน?
Go เป็นหนึ่งในไม่กี่ภาษาที่ควรจะเรียกใช้ 'ใกล้กับโลหะ' นั่นคือมันถูกรวบรวมพิมพ์แบบคงที่และเรียกใช้งานโค้ดโดยไม่ต้องใช้ VM สิ่งนี้ควรให้ความได้เปรียบด้านความเร็วเหนือ Java, C # และอื่น ๆ อย่างไรก็ตามดูเหมือนว่าอยู่หลัง Java (ดูProgramming Language Shootout ) ฉันสมมติว่าคอมไพเลอร์ที่มีวุฒิภาวะน้อยกว่ามีความรับผิดชอบอย่างมากในเรื่องนี้ แต่มีเหตุผลอื่นอีกไหม? มีอะไรในการออกแบบของ Go ที่จะป้องกันไม่ให้รันเร็วกว่าพูด Java หรือไม่? ฉันมีมุมมองที่ไม่ซับซ้อนมากของแบบจำลองรันไทม์ แต่ดูเหมือนว่าอย่างน้อยในหลักการแล้วมันควรจะสามารถทำงานได้เร็วกว่าจาวาเพราะต้องมีการประมวลผลโค้ดเนทีฟ

16
คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่ [ปิด]
คุณควรเสียสละการอ่านรหัสด้วยรหัสที่มีประสิทธิภาพหรือไม่ เช่น 3 บรรทัดของรหัสเป็น 1 บรรทัด ฉันอ่านในCode Craftโดย Pete Goodliffe ว่าการอ่านเป็นกุญแจสำคัญ ความคิดของคุณ?

4
คอมไพเลอร์ JIT สำหรับ C, C ++ และไลค์
มีคอมไพเลอร์ทันเวลาหรือไม่สำหรับภาษาที่คอมไพล์เช่น C และ C ++ (ชื่อแรกที่นึกได้คือ Clang และ LLVM! แต่ฉันไม่คิดว่าพวกเขาจะสนับสนุน) คำอธิบาย: ฉันคิดว่าซอฟต์แวร์สามารถได้รับประโยชน์จากข้อเสนอแนะการทำโปรไฟล์รันไทม์และการรวบรวมฮอตสปอตที่รันไทม์ให้ได้ประสิทธิภาพสูงสุดแม้สำหรับภาษาที่คอมไพล์ระหว่างเครื่องเช่น C และ C ++ การปรับให้เหมาะสมแบบแนะนำตัวด้วยโปรไฟล์ทำหน้าที่คล้ายกัน แต่ด้วยความแตกต่าง JIT จะมีความยืดหยุ่นมากขึ้นในสภาพแวดล้อมที่แตกต่างกัน ใน PGO คุณเรียกใช้ไบนารีของคุณก่อนที่จะปล่อย หลังจากคุณเผยแพร่แล้วจะไม่มีการรวบรวมผลตอบรับจากสภาพแวดล้อม / อินพุตที่รันไทม์ ดังนั้นหากรูปแบบการป้อนข้อมูลมีการเปลี่ยนแปลงมันจะสอบสวนเพื่อปรับประสิทธิภาพ แต่ JIT ใช้งานได้ดีแม้ในสภาพนั้น อย่างไรก็ตามฉันคิดว่ามันเป็นเรื่องที่ถกเถียงกันอยู่ว่าการรวบรวม JIT นั้นมีประโยชน์มากกว่าค่าใช้จ่ายของตัวเอง

5
การคาดคะเนสาขาทำงานอย่างไรถ้าคุณยังต้องตรวจสอบเงื่อนไข
ฉันกำลังอ่านคำตอบยอดนิยมเกี่ยวกับการทำนายสาขาจากhttps://stackoverflow.com/q/11227809/555690และมีบางอย่างที่ทำให้ฉันสับสน: หากคุณเดาถูกมันก็จะดำเนินต่อไป หากคุณเดาผิดกัปตันจะหยุดสำรองและตะโกนใส่คุณเพื่อสลับสวิตช์ จากนั้นมันสามารถรีสตาร์ทลงเส้นทางอื่น หากคุณเดาถูกทุกครั้งรถไฟจะไม่หยุด หากคุณเดาผิดบ่อยเกินไปรถไฟจะใช้เวลาหยุดมาก ๆ ในการสำรองและรีสตาร์ท แต่นี่คือสิ่งที่ฉันไม่ได้รับที่จะรู้ว่าคุณคงเดาได้ถูกต้องหรือไม่ถูกต้องคุณจะต้องทำให้การตรวจสอบสภาพอยู่แล้ว ดังนั้นการคาดคะเนสาขาจะทำงานได้อย่างไรถ้าอย่างใดอย่างหนึ่งที่คุณยังคงทำการตรวจสอบเงื่อนไขเดียวกัน สิ่งที่ฉันพยายามจะพูดคือไม่ได้ทำนายสาขาเหมือนกันกับที่ไม่มีการทำนายสาขาเลยเพราะคุณกำลังทำการตรวจสอบตามเงื่อนไขแบบเดียวกันหรือไม่? (เห็นได้ชัดว่าฉันผิด แต่ฉันไม่เข้าใจ)

2
การใช้คลาสนามธรรมและอินเทอร์เฟซที่เป็นนามธรรม
แม้ว่าสิ่งนี้จะไม่ได้บังคับในมาตรฐาน C ++ แต่ดูเหมือนว่าวิธี GCC เช่นใช้คลาสผู้ปกครองรวมถึงนามธรรมที่บริสุทธิ์คือการรวมตัวชี้ไปยังตาราง v สำหรับคลาสนามธรรมนั้นในทุกอินสแตนซ์ของคำถาม . โดยปกติแล้วสิ่งนี้จะขยายขนาดของอินสแตนซ์ของคลาสนี้โดยตัวชี้สำหรับคลาสพาเรนต์ทั้งหมดที่มี แต่ฉันสังเกตเห็นว่าคลาส C และโครงสร้างจำนวนมากมีอินเทอร์เฟซหลักมากมายซึ่งโดยทั่วไปแล้วเป็นคลาสนามธรรมที่บริสุทธิ์ ฉันจะแปลกใจถ้าทุกครั้งที่พูดDecimalถูกป่องด้วย 6 ตัวชี้ไปยังทุกมันเป็นอินเทอร์เฟซต่าง ๆ ดังนั้นถ้า C # ทำอินเตอร์เฟสแตกต่างกันอย่างน้อยในการใช้งานทั่วไป (ฉันเข้าใจว่ามาตรฐานตัวเองอาจไม่ได้กำหนดการนำไปใช้) และการใช้งาน C ++ มีวิธีหลีกเลี่ยงการขยายขนาดวัตถุเมื่อเพิ่มผู้ปกครองเสมือนบริสุทธิ์ให้กับชั้นเรียนหรือไม่?

9
วิธีจัดการกับความเข้าใจผิดเกี่ยวกับ“ การปรับให้เหมาะสมก่อนกำหนดเป็นรากของความชั่วทั้งหมด”?
ฉันได้พบกับคนมากมายที่ดื้อรั้นต่อสิ่งใดก็ตามซึ่งถือได้ว่าเป็น "การเพิ่มประสิทธิภาพ" ในความหมายทั่วไปของคำภาษาอังกฤษและพวกเขามักจะพูดคำต่อคำที่อ้างถึง (บางส่วน) "การเพิ่มประสิทธิภาพก่อนกำหนดเป็นรากฐานของความชั่วร้ายทั้งหมด" เป็นข้ออ้างสำหรับท่าทางของพวกเขาหมายความว่าพวกเขาตีความสิ่งที่ฉันกำลังพูดถึงจะเป็น "การเพิ่มประสิทธิภาพก่อนวัยอันควร" อย่างไรก็ตามมุมมองเหล่านี้บางครั้งก็ยึดมั่นอย่างน่าขันที่พวกเขาไม่สนใจความแตกต่างของอัลกอริทึมหรือโครงสร้างข้อมูลใด ๆ จากการดำเนินการ "ไร้เดียงสา" ที่บริสุทธิ์ที่สุด ... หรืออย่างน้อยเบี่ยงเบนจากวิธีที่พวกเขาทำสิ่งต่าง ๆ มาก่อนคนเราจะเข้าหากันเช่นนี้ได้อย่างไรเพื่อทำให้พวกเขา "เปิดหู" อีกครั้งหลังจากพวกเขาปิดตัวลงจากการได้ยินเกี่ยวกับ "ประสิทธิภาพ" หรือ "การเพิ่มประสิทธิภาพ" ฉันจะหารือเกี่ยวกับหัวข้อการออกแบบ / การนำไปใช้งานซึ่งมีผลกระทบต่อประสิทธิภาพโดยไม่ต้องให้ผู้คนคิดในทันทีว่า: "ผู้ชายคนนี้ต้องการใช้เวลาสองสัปดาห์ในรหัสสิบบรรทัด?" ตอนนี้ท่าทางว่า "การเพิ่มประสิทธิภาพทั้งหมดจะคลอดก่อนกำหนดและดังนั้นความชั่วร้าย" หรือไม่ได้รับแล้วครอบคลุมที่นี่เช่นเดียวกับในมุมอื่น ๆ ของเว็บและจะได้รับการกล่าวถึงวิธีการรับรู้เมื่อการเพิ่มประสิทธิภาพการคลอดก่อนกำหนดและดังนั้นจึงชั่วร้ายแต่ โชคไม่ดีที่มีคนในโลกแห่งความเป็นจริงที่ยังไม่เปิดกว้างต่อความท้าทายต่อความเชื่อมั่นในการต่อต้านการเพิ่มประสิทธิภาพ ความพยายามครั้งก่อน สองสามครั้งฉันได้ลองเสนอราคาที่สมบูรณ์จาก Donald Knuthเพื่ออธิบายว่า "การปรับให้เหมาะสมก่อนกำหนดไม่ดี" ↛ "การเพิ่มประสิทธิภาพทั้งหมดไม่ดี": เราควรลืมเกี่ยวกับประสิทธิภาพเล็กน้อยพูดถึง 97% ของเวลา: การเพิ่มประสิทธิภาพก่อนวัยอันควรเป็นรากฐานของความชั่วร้ายทั้งหมด แต่เราไม่ควรพลาดโอกาสที่สำคัญ 3% อย่างไรก็ตามเมื่อมีการเสนอราคาทั้งหมดบางครั้งคนเหล่านี้จะมีความมั่นใจมากขึ้นว่าสิ่งที่ฉันทำคือการเพิ่มประสิทธิภาพก่อนวัยอันควรและขุดและปฏิเสธที่จะฟัง เกือบจะเหมือนกับว่าคำว่า "การปรับให้เหมาะสม" ทำให้พวกเขากลัว: ในสองสามครั้งที่ฉันสามารถเสนอการเปลี่ยนแปลงที่เกิดขึ้นจริงในการปรับปรุงโค้ดโดยที่พวกเขาถูกคัดค้านโดยเพียงแค่หลีกเลี่ยงการใช้คำว่า "optimiz …

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