TD; DR:
มีความสับสนเกี่ยวกับสิ่งที่ฉันถามดังนั้นนี่คือแนวคิดการขับขี่ที่อยู่เบื้องหลังคำถาม:
ฉันมักจะตั้งคำถามว่ามันคืออะไร ฉันอาจไม่ได้พูดชัดแจ้ง แต่แรกเริ่ม แต่เจตนาได้เสมอ " เป็นโมดูลแยกแยกหลวมคู่ decoupled รหัส refactored " ช้าลงอย่างเห็นได้ชัดโดยธรรมชาติของตัวเองมากกว่า " เสาเดียวหน่วยทำทุกอย่างในที่เดียวหนึ่งไฟล์คู่แน่น " รหัส ส่วนที่เหลือเป็นเพียงรายละเอียดและอาการต่าง ๆ ของเรื่องนี้ที่ฉันเจอในตอนนี้หรือตอนนี้หรือจะในภายหลัง มันช้าลงอย่างแน่นอนในระดับหนึ่ง เช่นเดียวกับดิสก์ที่ไม่มีการดีแฟรกต์คุณต้องเลือกชิ้นส่วนจากทุกที่ มันช้ากว่า ได้อย่างแน่นอน แต่ฉันควรสนใจ
และคำถามไม่ได้เกี่ยวกับ ...
ไม่เกี่ยวกับการเพิ่มประสิทธิภาพขนาดเล็กการปรับให้เหมาะสมก่อนวัยและอื่น ๆ มันไม่เกี่ยวกับ "เพิ่มประสิทธิภาพส่วนนี้หรือส่วนที่ตาย"
ถ้าเช่นนั้นจะเป็นอะไร
เป็นเรื่องเกี่ยวกับระเบียบวิธีและเทคนิคโดยรวมและวิธีคิดเกี่ยวกับการเขียนโค้ดที่เกิดขึ้นเมื่อเวลาผ่านไป:
- "ฉีดรหัสนี้ในชั้นเรียนของคุณเป็นการพึ่งพา"
- "เขียนหนึ่งไฟล์ต่อคลาส"
- "แยกมุมมองของคุณออกจากฐานข้อมูลตัวควบคุมโดเมน"
- อย่าเขียน codeblock สปาเก็ตตี้ที่เป็นเนื้อเดียวกัน แต่เขียนส่วนประกอบแยกส่วนจำนวนมากที่ทำงานร่วมกัน
มันเกี่ยวกับวิธีการและรูปแบบของรหัสที่ปัจจุบัน - ภายในทศวรรษนี้ - เห็นและสนับสนุนในกรอบการทำงานส่วนใหญ่ที่สนับสนุนการประชุมส่งต่อผ่านชุมชน มันเป็นการเปลี่ยนความคิดจาก 'monolithic blocks' เป็น 'microservices' และด้วยราคานั้นในแง่ของประสิทธิภาพระดับเครื่องและค่าโสหุ้ยและค่าใช้จ่ายระดับโปรแกรมเมอร์บางส่วนเช่นกัน
คำถามเดิมดังนี้:
ในสาขาวิทยาการคอมพิวเตอร์ฉันได้สังเกตเห็นการเปลี่ยนแปลงที่โดดเด่นในการคิดเมื่อมันมาถึงการเขียนโปรแกรม ฉันเจอคำแนะนำที่ค่อนข้างบ่อยเช่นนี้:
- เขียนโค้ดฟังก์ชั่นที่เล็กลง (ทดสอบได้และบำรุงรักษาได้มากกว่านี้)
- refactor โค้ดที่มีอยู่แล้วให้เป็นโค้ดที่เล็กลงเรื่อย ๆ จนกระทั่งส่วนใหญ่ของเมธอด / ฟังก์ชั่นของคุณมีความยาวเพียงไม่กี่บรรทัดและชัดเจนว่าจุดประสงค์ของมันคืออะไร (ซึ่งสร้างฟังก์ชั่นได้มากกว่าเมื่อเทียบกับบล็อกขนาดใหญ่)
- ฟังก์ชั่นการเขียนที่ทำสิ่งเดียวเท่านั้น - การแยกข้อกังวล ฯลฯ (ซึ่งมักจะสร้างฟังก์ชั่นมากขึ้นและเฟรมเพิ่มเติมในสแต็ก)
- สร้างไฟล์เพิ่มเติม (หนึ่งคลาสต่อไฟล์, คลาสที่มากขึ้นสำหรับวัตถุประสงค์ในการย่อยสลาย, สำหรับวัตถุประสงค์เลเยอร์เช่น MVC, สถาปัตยกรรมโดเมน, รูปแบบการออกแบบ, OO, ฯลฯ ซึ่งสร้างการเรียกระบบไฟล์เพิ่มเติม)
นี่คือการเปลี่ยนแปลงเมื่อเปรียบเทียบกับการเข้ารหัสแบบ "เก่า" หรือ "ล้าสมัย" หรือ "ปาเก็ตตี้" ซึ่งคุณมีวิธีการที่ครอบคลุม 2,500 บรรทัดและคลาสขนาดใหญ่และวัตถุเทพเจ้าทำทุกสิ่ง
คำถามของฉันคือ:
เมื่อโทรมาที่รหัสเครื่องถึง 1s และ 0s ถึงคำแนะนำในการประกอบแผ่นดิสก์ HDD ฉันควรจะกังวลว่ารหัส OO ที่แยกชั้นอย่างสมบูรณ์แบบด้วยฟังก์ชั่นเล็ก ๆ น้อย ๆ ที่สร้างใหม่และวิธีการต่าง ๆ ก็สร้างขึ้นเช่นกัน ค่าใช้จ่ายพิเศษมากแค่ไหน?
รายละเอียด
ในขณะที่ฉันไม่คุ้นเคยอย่างใกล้ชิดกับวิธีการจัดการรหัส OO และวิธีการเรียกใช้ใน ASM ในตอนท้ายและวิธีที่การเรียก DB และคอมไพเลอร์การแปลไปยังแขน actuator บน HDD แผ่นเสียงฉันมีความคิดบางอย่าง ฉันคิดว่าการเรียกฟังก์ชั่นพิเศษแต่ละครั้งการเรียกวัตถุหรือการโทร "#include" (ในบางภาษา) สร้างชุดคำสั่งเพิ่มเติมซึ่งเป็นการเพิ่มปริมาณของรหัสและเพิ่มค่าใช้จ่าย "การเดินสายรหัส" โดยไม่ต้องเพิ่มรหัส "ประโยชน์" จริง . ฉันยังนึกภาพว่าการเพิ่มประสิทธิภาพที่ดีสามารถทำได้กับ ASM ก่อนที่มันจะทำงานบนฮาร์ดแวร์ แต่การเพิ่มประสิทธิภาพนั้นก็ทำได้เช่นกันเช่นกัน
ดังนั้นคำถามของฉัน - ค่าใช้จ่ายเท่าไหร่ (ในพื้นที่และความเร็ว) ทำรหัสที่แยกกันอย่างดี (รหัสที่แบ่งออกเป็นหลายร้อยไฟล์คลาสและรูปแบบการออกแบบ ฯลฯ ) แนะนำจริง ๆ แล้วเมื่อเทียบกับการมี "หนึ่งวิธีใหญ่ที่มี ทุกอย่างในไฟล์เสาหินเดียว "เนื่องจากค่าใช้จ่ายนี้?
อัปเดตเพื่อความชัดเจน:
ฉันสมมติว่าการใช้รหัสเดียวกันและแยกมัน refactoring มันออกมา decoupling มันในฟังก์ชั่นมากขึ้นและวัตถุและวิธีการและชั้นเรียนจะส่งผลให้พารามิเตอร์ผ่านมากขึ้นระหว่างชิ้นรหัสขนาดเล็ก เพราะแน่นอนว่าการเปลี่ยนรหัสใหม่จะต้องทำให้เธรดดำเนินต่อไปและต้องผ่านพารามิเตอร์ วิธีการเพิ่มเติมหรือมากกว่านั้นเรียนรู้วิธีการออกแบบรูปแบบโรงงานมากขึ้นส่งผลให้เกิดค่าใช้จ่ายในการส่งผ่านข้อมูลต่างๆมากกว่าที่เป็นในชั้นเดียวหรือวิธีการ
มีการกล่าวว่ามีบางแห่ง (quote TBD) ที่มากถึง 70% ของรหัสทั้งหมดประกอบด้วยคำสั่ง MOV ของ ASM - การโหลด CPU register ที่มีตัวแปรที่เหมาะสมไม่ใช่การคำนวณจริง ในกรณีของฉันคุณโหลดเวลาของ CPU ด้วยคำแนะนำ PUSH / POP เพื่อให้การเชื่อมโยงและพารามิเตอร์ผ่านระหว่างส่วนต่าง ๆ ของรหัส ยิ่งคุณสร้างโค้ดให้น้อยลงคุณจำเป็นต้องมี "การเชื่อมโยง" ของโสหุ้ยมากขึ้น ฉันกังวลว่าการเชื่อมโยงนี้จะเพิ่มในซอฟแวร์ที่ขยายตัวและชะลอตัวลงและฉันสงสัยว่าฉันควรจะกังวลเกี่ยวกับเรื่องนี้หรือไม่และถ้ามีมากแค่ไหนเพราะโปรแกรมเมอร์รุ่นปัจจุบันและอนาคตที่กำลังสร้างซอฟต์แวร์สำหรับศตวรรษหน้า จะต้องอยู่กับและบริโภคซอฟต์แวร์ที่สร้างขึ้นโดยใช้วิธีการเหล่านี้
อัปเดต: หลายไฟล์
ฉันกำลังเขียนรหัสใหม่ในขณะนี้ซึ่งจะเป็นการแทนที่รหัสเก่าอย่างช้าๆ โดยเฉพาะฉันได้ตั้งข้อสังเกตว่าหนึ่งในชั้นเรียนเก่าเป็นไฟล์ ~ 3000 บรรทัด (ดังกล่าวก่อนหน้า) ตอนนี้มันกำลังกลายเป็นชุดของไฟล์ 15-20 ที่ตั้งอยู่ในไดเรกทอรีต่าง ๆ รวมถึงไฟล์ทดสอบและไม่รวมถึงเฟรมเวิร์ก PHP ที่ฉันใช้เพื่อผูกบางสิ่งเข้าด้วยกัน มีไฟล์เพิ่มเติมเข้ามาเช่นกัน เมื่อพูดถึงดิสก์ I / O การโหลดหลายไฟล์จะช้ากว่าการโหลดไฟล์ขนาดใหญ่หนึ่งไฟล์ แน่นอนว่าไม่ใช่ทุกไฟล์ที่โหลดมันจะโหลดตามต้องการและมีตัวเลือกแคชดิสก์และตัวเลือกแคชหน่วยความจำอยู่ แต่ผมก็ยังเชื่อว่าloading multiple files
จะประมวลผลได้มากกว่าloading a single file
ในหน่วยความจำ ฉันกำลังเพิ่มที่อยู่ในความกังวลของฉัน
ปรับปรุง: พึ่งพาฉีดทุกอย่าง
กลับมาที่นี่อีกซักพักนึง .. ฉันคิดว่าคำถามของฉันผิดไป หรือบางทีฉันเลือกที่จะเข้าใจผิดบางคำตอบ ฉันไม่ได้พูดถึงการเพิ่มประสิทธิภาพแบบไมโครเนื่องจากคำตอบบางอย่างแยกออกมา (อย่างน้อยฉันก็คิดว่าการเรียกสิ่งที่ฉันกำลังพูดถึงเรื่องการเพิ่มประสิทธิภาพแบบไมโครเป็นตัวเรียกชื่อผิด) แต่เกี่ยวกับการเคลื่อนไหวของ "รหัส Refactor ในทุกระดับของรหัส ฉันมาจาก Zend Con เมื่อเร็ว ๆ นี้ที่รูปแบบของรหัสนี้เป็นหนึ่งในประเด็นหลักและเป็นจุดศูนย์กลางของการประชุม แยกตรรกะออกจากมุมมองดูจากโมเดลจำลองจากฐานข้อมูลและหากทำได้ให้แยกข้อมูลออกจากฐานข้อมูล พึ่งพา - ฉีดทุกสิ่งซึ่งบางครั้งหมายถึงเพียงแค่เพิ่มรหัสการเดินสายไฟ (ฟังก์ชั่นชั้นเรียนสำเร็จรูป) ที่ไม่ทำอะไรเลยแต่ทำหน้าที่เป็นจุดตะเข็บ / ตะขอได้อย่างง่ายดายเพิ่มขนาดโค้ดในกรณีส่วนใหญ่
UPDATE 2: การ "แยกรหัสเป็นไฟล์เพิ่มเติม" มีผลกระทบต่อประสิทธิภาพอย่างมากหรือไม่ (ในทุกระดับของการคำนวณ)
ปรัชญาของcompartmentalize your code into multiple files
การใช้คอมพิวเตอร์ในปัจจุบันส่งผลอย่างไร (ประสิทธิภาพ, การใช้ดิสก์, การจัดการหน่วยความจำ, งานประมวลผล CPU)
ฉันกำลังพูดถึง
ก่อน...
ในอดีตที่ผ่านมา แต่จริง ๆ แล้วไม่ไกลมากนักคุณสามารถเขียนโมโนบล็อกหนึ่งไฟล์ที่มีรูปแบบและมุมมองและคอนโทรลเลอร์สปาเก็ตตี้หรือสปาเก็ตตี้ที่ไม่ได้เข้ารหัส แต่มันทำงานทุกอย่างเมื่อโหลดเรียบร้อยแล้ว การทำเบนช์มาร์กในอดีตโดยใช้รหัส C ฉันพบว่ามันเร็วกว่ามากในการโหลดไฟล์ 900Mb หนึ่งไฟล์ลงในหน่วยความจำและประมวลผลเป็นชิ้นขนาดใหญ่กว่าเพื่อโหลดไฟล์ขนาดเล็กลงและประมวลผลในมื้อเล็ก ๆ ชิ้นงานเดียวกันในที่สุด
.. และตอนนี้*
วันนี้ฉันพบว่าตัวเองกำลังดูรหัสที่แสดงบัญชีแยกประเภทที่มีคุณสมบัติเช่น .. หากรายการนั้นเป็น "คำสั่งซื้อ" แสดงบล็อก HTML ของคำสั่งซื้อ หากสามารถคัดลอกรายการโฆษณาได้ให้พิมพ์บล็อก HTML ที่แสดงไอคอนและพารามิเตอร์ HTML ไว้ด้านหลังเพื่อให้คุณสามารถทำสำเนาได้ หากรายการนั้นสามารถเลื่อนขึ้นหรือลงให้แสดงลูกศร HTML ที่เหมาะสม เป็นต้นฉันสามารถสร้าง Zend Framework ผ่านทางpartial()
การโทรซึ่งโดยพื้นฐานแล้วหมายถึง "การเรียกใช้ฟังก์ชันที่ใช้พารามิเตอร์ของคุณและแทรกลงในไฟล์ HTML แยกต่างหากที่มันเรียก" ฉันสามารถสร้างฟังก์ชั่น HTML แยกต่างหากสำหรับส่วนที่เล็กที่สุดของบัญชีแยกประเภท หนึ่งรายการสำหรับลูกศรขึ้น, ลูกศรลง, หนึ่งรายการสำหรับ "ฉันสามารถคัดลอกรายการนี้" ฯลฯ สร้างไฟล์ได้อย่างง่ายดายเพียงเพื่อแสดงส่วนเล็ก ๆ ของหน้าเว็บ การใช้โค้ดของฉันและโค้ดเบื้องหลัง Zend Framework ของฉันระบบ / สแต็กอาจเรียกไฟล์ใกล้เคียงกันได้ถึง 20-30 ไฟล์
อะไร?
ฉันสนใจในแง่มุมการสึกหรอบนเครื่องที่สร้างขึ้นโดยการแบ่งรหัสออกเป็นไฟล์เล็ก ๆ หลายไฟล์
ตัวอย่างเช่นการโหลดไฟล์เพิ่มเติมหมายถึงการที่พวกเขาอยู่ในสถานที่ต่าง ๆ ของระบบไฟล์และในสถานที่ต่าง ๆ ของฟิสิคัล HDD ซึ่งหมายถึง HDD มากขึ้นในการค้นหาและอ่านเวลา
สำหรับ CPU อาจหมายถึงการสลับบริบทและโหลดรีจิสเตอร์ต่างๆ
ในบล็อกย่อยนี้ (อัปเดต # 2) ฉันสนใจมากขึ้นในการใช้หลายไฟล์เพื่อทำงานเดียวกันกับที่ทำได้ในไฟล์เดียวส่งผลกระทบต่อประสิทธิภาพของระบบ
ใช้ Zend Form API เทียบกับ HTML ธรรมดา
ฉันใช้ Zend Form API กับวิธีปฏิบัติ OO ที่ทันสมัยที่สุดและทันสมัยที่สุดเพื่อสร้างฟอร์ม HTML ที่มีการตรวจสอบความถูกต้องเปลี่ยนPOST
เป็นวัตถุโดเมน
เอาไป 35 ไฟล์เพื่อทำ
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
ซึ่งทั้งหมดนี้สามารถแทนที่ด้วยไฟล์ HTML + PHP + JS + CSS อย่างง่ายจำนวนไม่กี่ไฟล์ซึ่งอาจรวมเป็นไฟล์น้ำหนักเบาทั้งหมด 4 ไฟล์
มันจะดีกว่า มันคุ้มหรือไม่ ... ลองนึกภาพการโหลด 35 ไฟล์ + ไฟล์ไลบรารี Zend Zramework จำนวนมากที่ทำให้ทำงานได้ vs ไฟล์ธรรมดา 4 ไฟล์