ในบางครั้งรหัสแฝงต่ำต้อง“ น่าเกลียด” หรือไม่


21

(นี่คือจุดมุ่งหมายหลักที่ผู้ที่มีความรู้เฉพาะเกี่ยวกับระบบเวลาแฝงต่ำเพื่อหลีกเลี่ยงคนที่เพิ่งตอบด้วยความคิดเห็นที่ไม่พร้อมเพรียง)

คุณรู้สึกว่ามีการแลกเปลี่ยนระหว่างการเขียนโค้ด "ดี" ของโอเรียนท์กับการเขียนโค้ดเวลาแฝงที่ต่ำมาก ๆ หรือไม่? ตัวอย่างเช่นการหลีกเลี่ยงฟังก์ชั่นเสมือนจริงใน C ++ / ค่าโสหุ้ยของ polymorphism เป็นต้นการเขียนโค้ดที่ดูน่ารังเกียจ แต่มันเร็วมากหรือเปล่า?

มันยืนอยู่กับเหตุผล - ใครสนใจว่ามันดูน่าเกลียด (ตราบใดที่มันบำรุงรักษาได้) - ถ้าคุณต้องการความเร็วคุณต้องการความเร็ว

ฉันจะสนใจที่จะได้ยินจากคนที่ทำงานในพื้นที่ดังกล่าว


1
@ user997112: เหตุผลที่ปิดคือการอธิบายตนเอง มันบอกว่า: "เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญเฉพาะด้าน แต่คำถามนี้มีแนวโน้มที่จะเรียกร้องการถกเถียงการโต้เถียงการหยั่งเสียงหรือการอภิปรายที่ยืดเยื้อ ไม่ได้หมายความว่าพวกเขาถูกต้อง เหตุผลที่เลือกโดยผู้มีสิทธิ์เลือกตั้งทั้งสามคน
Robert Harvey

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

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

1
ซอร์สโค้ดสำหรับ DisMAX ของ LMAX นั้นไม่น่าเกลียดนัก มีบางส่วนที่ 'ตกนรกด้วยโมเดลความปลอดภัยของ Java' (คลาสที่ไม่ปลอดภัย) และการปรับเปลี่ยนเฉพาะฮาร์ดแวร์บางอย่าง (ตัวแปรที่เพิ่มเบาะแคช) แต่มันเป็น IMO ที่อ่านได้ง่ายมาก
James

5
@ Carson63000, user1598390 และผู้อื่นเป็นที่สนใจ: ถ้าคำถามปลายปิดเพิ่มขึ้นรู้สึกอิสระที่จะถามเกี่ยวกับการปิดบนของเราเว็บไซต์ Metaมีจุดเล็ก ๆ ในการอภิปรายปิดในการแสดงความคิดเห็นโดยเฉพาะอย่างยิ่งการปิดที่ไม่ได้เกิดขึ้น นอกจากนี้โปรดทราบว่าทุกคำถามที่ปิดสามารถเปิดใหม่ได้มันไม่ใช่จุดสิ้นสุดของโลก ยกเว้นแน่นอนถ้าชาวมายันถูกต้องในกรณีนี้มันก็เป็นเรื่องดีที่รู้ว่าคุณทุกคน!
yannis

คำตอบ:


31

คุณรู้สึกว่ามีการแลกเปลี่ยนระหว่างการเขียนโค้ด "ดี" ของโอเรียนท์และการเขียนโค้ดเวลาแฝงที่ต่ำมาก [sic] หรือไม่?

ใช่.

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

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


15
"ทำให้มันทำงานแล้วทำให้เร็ว" คำตอบนี้ค่อนข้างครอบคลุมทุกอย่างที่ฉันคิดว่าจะพูดเมื่อฉันอ่านคำถาม
Carson63000

13
ฉันจะเพิ่ม "การวัดอย่าเดา"
Martijn Verburg

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

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

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

5

ใช่ตัวอย่างที่ฉันให้ไม่ใช่ C ++ กับ Java แต่เป็น Assembly vs. COBOL ตามที่ฉันรู้

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

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

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


3

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

การแลกเปลี่ยนมาจากต้นทุนทางธุรกิจ รหัสที่ซับซ้อนมากขึ้นนั้นต้องการโปรแกรมเมอร์ที่มีทักษะสูงกว่า (และโปรแกรมเมอร์ที่มีชุดทักษะที่เน้นมากขึ้นเช่นที่มีสถาปัตยกรรม CPU และความรู้ด้านการออกแบบ) ต้องใช้เวลาในการอ่านและทำความเข้าใจรหัสและแก้ไขข้อบกพร่องมากขึ้น ต้นทุนทางธุรกิจของการพัฒนาและบำรุงรักษารหัสดังกล่าวอาจอยู่ในช่วง 10x - 100x เมื่อเทียบกับรหัสที่เขียนขึ้นตามปกติ

ค่าบำรุงรักษานี้มีความสมเหตุสมผลในบางอุตสาหกรรมซึ่งลูกค้ายินดีจ่ายค่าพรีเมี่ยมที่สูงมากสำหรับซอฟต์แวร์ที่รวดเร็วมาก

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

ดังนั้นเจ้าของธุรกิจควร:

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

การแลกเปลี่ยนเหล่านี้มีความเฉพาะเจาะจงอย่างมากกับสถานการณ์

สิ่งเหล่านี้ไม่สามารถตัดสินใจได้อย่างเหมาะสมหากปราศจากการมีส่วนร่วมของผู้จัดการและเจ้าของผลิตภัณฑ์

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


ใช่มันเป็นความจริงโดยทั่วไปว่าโค้ดที่เร็วกว่านั้นดูแตกต่างจากโค้ดที่เขียนตามปกติ รหัสใด ๆ ที่แตกต่างกันจะใช้เวลาในการอ่านนานขึ้น ไม่ว่าจะเป็นการสื่อถึงความอัปลักษณ์อยู่ในสายตาของคนดูหรือไม่

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

โดยทั่วไปแล้ว SIMD จะมีผลกระทบรุนแรงต่อความสามารถในการอ่านระดับต่ำถึงแม้ว่าโดยทั่วไปแล้วจะไม่ต้องการการเปลี่ยนแปลงโครงสร้างระดับสูงกว่า (โดยที่ API นั้นได้รับการออกแบบโดยคำนึงถึงการป้องกันปัญหาคอขวด)

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

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

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

ในการทำให้รหัสดังกล่าวสามารถรักษาได้ผู้เขียนรหัสดังกล่าวจะต้องเขียนเอกสารที่ซับซ้อนของอัลกอริทึมซึ่งไกลเกินกว่าความคิดเห็นของรหัสหรือไดอะแกรม UML สำหรับรหัสที่เขียนตามปกติ สิ่งนี้คล้ายกับวิธีที่นักวิจัยเขียนบทความทางวิชาการ


ไม่รหัสที่รวดเร็วไม่จำเป็นต้องขัดแย้งกับ object-orientedness

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

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

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


2

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

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


2

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

การเพิ่มประสิทธิภาพอื่น ๆ เช่นการวนลูปสามารถเพิ่มในลักษณะที่สะอาดเมื่อต้องการ

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

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


2

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

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

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


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

การติดตั้งใช้งานเป็นตัวเลือกคำที่ไม่ดีในการสนทนา OOPish ฉันหมายถึงมันในแง่ของความง่ายในการใช้ซ้ำและแก้ไข # 2 ฉันเพิ่งเพิ่มประโยคเพื่อพิสูจน์ว่า 2 เป็นหลักที่ฉันทำ
Erik Reppen

1

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

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


1

คุณรู้สึกว่ามีการแลกเปลี่ยนระหว่างการเขียนโค้ด "ดี" ของโอเรียนท์กับการเขียนโค้ดเวลาแฝงที่ต่ำมาก ๆ หรือไม่? ตัวอย่างเช่นการหลีกเลี่ยงฟังก์ชั่นเสมือนจริงใน C ++ / ค่าโสหุ้ยของ polymorphism เป็นต้นการเขียนโค้ดที่ดูน่ารังเกียจ แต่มันเร็วมากหรือเปล่า?

ผมทำงานในสาขาซึ่งเป็นบิตเน้นมากขึ้นในการส่งผ่านกว่าแฝง แต่มันมากประสิทธิภาพการทำงานที่สำคัญและผมว่า"sorta"

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

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

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

การออกแบบเพื่อประสิทธิภาพ

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

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

การออกแบบส่วนต่อประสานที่หยาบ

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

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

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

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

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

พูลหน่วยความจำ

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

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

ประเภทระบบแยกหน่วยความจำ

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

ตัวอย่างทั่วไปใน C ++ สำหรับกรณีที่ต้องการ polymorphism ซึ่งการทดลองตามธรรมชาติคือการจัดสรรแต่ละคลาสย่อยของคลาสย่อยกับตัวจัดสรรหน่วยความจำทั่วไป

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

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

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

การรวมหน่วยความจำกลับมารวมกัน

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

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

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

น่าเกลียด

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

เป็นอันตราย

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

ความงาม

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

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

TL; DR

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


0

ไม่แตกต่างกัน แต่นี่คือสิ่งที่ฉันทำ:

  1. เขียนสะอาดและบำรุงรักษา

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

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

ดังนั้นจะมีการแลกเปลี่ยนหรือไม่? ฉันไม่คิดอย่างนั้นจริงๆ


0

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


0

ผู้ใช้ปลายทางมีความสำคัญอย่างไร?

  • ประสิทธิภาพ
  • คุณสมบัติ / ฟังก์ชั่น
  • ออกแบบ

กรณีที่ 1: โค้ดที่ไม่เหมาะสมที่ปรับให้เหมาะสม

  • บำรุงรักษายาก
  • อ่านได้ยากหากเป็นโครงการโอเพนซอร์ซ

กรณีที่ 2: รหัสที่ไม่เหมาะ

  • บำรุงรักษาง่าย
  • ประสบการณ์การใช้งานไม่ดี

วิธีการแก้?

ง่ายต่อการเพิ่มประสิทธิภาพชิ้นส่วนที่สำคัญของรหัส

เช่น:

โปรแกรมที่ประกอบด้วยวิธีการ 5 วิธีโดย 3 วิธีเป็นการจัดการข้อมูล 1 รายการสำหรับการอ่านดิสก์และอีกวิธีหนึ่งสำหรับการเขียนดิสก์

วิธีการจัดการข้อมูลทั้งสามนี้ใช้วิธี I / O สองวิธีและขึ้นอยู่กับวิธีเหล่านั้น

เราจะปรับวิธีการ I / O ให้เหมาะสม

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

ซึ่งหมายความว่าเราได้รับรหัสที่ดีและการออกแบบที่จัดการได้ของโปรแกรมในขณะที่ทำให้มันรวดเร็วโดยการปรับบางส่วนของรหัส

ฉันคิด..

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

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