ฉันเป็นนักเรียนในสาขาวิทยาศาสตร์คอมพิวเตอร์และฉันได้ยินคำว่า "โสหุ้ย" มากเมื่อพูดถึงโปรแกรมและการเรียงลำดับ สิ่งนี้หมายความว่าอะไรกันแน่?
ฉันเป็นนักเรียนในสาขาวิทยาศาสตร์คอมพิวเตอร์และฉันได้ยินคำว่า "โสหุ้ย" มากเมื่อพูดถึงโปรแกรมและการเรียงลำดับ สิ่งนี้หมายความว่าอะไรกันแน่?
คำตอบ:
เป็นทรัพยากรที่จำเป็นสำหรับการตั้งค่าการดำเนินการ มันอาจดูเหมือนไม่เกี่ยวข้อง แต่จำเป็น
เหมือนเมื่อคุณต้องไปที่ไหนสักแห่งคุณอาจต้องการรถยนต์ แต่มันจะมีค่าใช้จ่ายมากมายในการขับรถไปตามถนนดังนั้นคุณอาจต้องการเดิน อย่างไรก็ตามค่าโสหุ้ยจะคุ้มถ้าคุณเดินทางข้ามประเทศ
ในวิทยาการคอมพิวเตอร์บางครั้งเราใช้รถยนต์เพื่อไปตามถนนเพราะเราไม่มีวิธีที่ดีกว่าหรือไม่คุ้มค่ากับเวลาของเราที่จะ "เรียนรู้วิธีการเดิน"
ความหมายของคำสามารถแตกต่างกันมากกับบริบท โดยทั่วไปเป็นทรัพยากร (ส่วนใหญ่มักจะเป็นหน่วยความจำและเวลา CPU) ที่ใช้ซึ่งไม่ได้มีส่วนร่วมโดยตรงกับผลลัพธ์ที่ต้องการ แต่ต้องใช้เทคโนโลยีหรือวิธีการที่ใช้ ตัวอย่าง:
malloc
มีค่าใช้จ่ายในตัว 8 ไบต์เนื่องจากตัวจัดสรร (สมมติว่าเครื่อง 32 บิตแบบคลาสสิก) ประกอบด้วยขนาดของบล็อกบวกค่าป้องกัน และนั่นคือก่อนที่คุณจะนึกถึงการจัดสรรอย่างละเอียด รายการที่เชื่อมโยงเดี่ยว ๆ ของจำนวนเต็ม 4 ไบต์แบบง่ายจะมีค่าใช้จ่าย 75%; อาร์เรย์จะดีกว่ามาก (นอกเสียจากว่าคุณต้องการการแทรกที่รวดเร็วที่ตรงกลาง) เนื่องจากพวกเขาสามารถมีโอเวอร์เฮดหนึ่งครั้ง (หรือน้อยกว่าหากอาร์เรย์ไม่ได้ถูกจัดสรรแบบไดนามิก)
คุณเหนื่อยและไม่สามารถทำงานได้อีกต่อไป คุณกินอาหาร พลังงานที่ใช้ในการมองหาอาหารได้มาและกินจริง ๆ กินพลังงานและค่าใช้จ่าย!
ค่าใช้จ่ายเป็นสิ่งที่สูญเปล่าเพื่อให้งานสำเร็จ เป้าหมายคือการทำให้ค่าใช้จ่ายเล็กมาก
ในวิทยาการคอมพิวเตอร์ช่วยบอกว่าคุณต้องการพิมพ์ตัวเลขนั่นคืองานของคุณ แต่การจัดเก็บหมายเลขการตั้งค่าจอแสดงผลเพื่อพิมพ์และเรียกรูทีนเพื่อพิมพ์จากนั้นการเข้าถึงหมายเลขจากตัวแปรจะอยู่เหนือศีรษะทั้งหมด
เราครอบคลุม Wikipedia :
ในวิทยาศาสตร์คอมพิวเตอร์ค่าใช้จ่ายโดยทั่วไปถือว่าเป็นการรวมกันของเวลาในการคำนวณมากเกินไปหรือโดยอ้อมหน่วยความจำแบนด์วิดท์หรือทรัพยากรอื่น ๆ ที่จำเป็นเพื่อให้บรรลุเป้าหมายเฉพาะ มันเป็นกรณีพิเศษของค่าใช้จ่ายด้านวิศวกรรม
โดยทั่วไปค่าโสหุ้ยหมายถึงปริมาณทรัพยากรเพิ่มเติม (หน่วยความจำตัวประมวลผลเวลา ฯลฯ ) ที่อัลกอริทึมการเขียนโปรแกรมที่แตกต่างกันใช้
ตัวอย่างเช่นค่าใช้จ่ายในการแทรกลงในทรีไบนารีแบบสมดุลอาจมีขนาดใหญ่กว่าเม็ดมีดแบบเดียวกันในรายการที่เชื่อมโยงแบบง่าย (การแทรกจะใช้เวลานานกว่าใช้พลังการประมวลผลมากขึ้นเพื่อทำให้สมดุลต้นไม้ซึ่งส่งผลให้ ผู้ใช้งาน).
สำหรับโอเวอร์เฮดของโปรแกรมเมอร์หมายถึงทรัพยากรระบบซึ่งถูกใช้โดยรหัสของคุณเมื่อมันทำงานบนแพลตฟอร์มที่ให้ในชุดข้อมูลอินพุตที่กำหนด โดยทั่วไปคำนี้จะใช้ในบริบทของการเปรียบเทียบการใช้งานที่แตกต่างกันหรือการใช้งานที่เป็นไปได้
ตัวอย่างเช่นเราอาจบอกว่าวิธีการเฉพาะอาจมีค่าใช้จ่าย CPU จำนวนมากในขณะที่อีกวิธีหนึ่งอาจมีค่าใช้จ่ายหน่วยความจำเพิ่มเติมและอีกวิธีหนึ่งอาจถ่วงน้ำหนักค่าใช้จ่ายเครือข่าย (และยกตัวอย่างเช่นการพึ่งพาภายนอก)
ให้ตัวอย่างที่เฉพาะเจาะจง: คำนวณค่าเฉลี่ย (ค่าเฉลี่ยเลขคณิต) ของชุดตัวเลข
วิธีการที่ชัดเจนคือการวนลูปของอินพุตทำให้รวมผลรวมและจำนวน เมื่อพบหมายเลขสุดท้าย (ส่งสัญญาณโดย "สิ้นสุดไฟล์" EOF หรือค่า Sentinel หรือ GUI buttom บางอย่าง) จากนั้นเราก็หารผลรวมด้วยจำนวนอินพุตและเราเสร็จแล้ว
วิธีการนี้ไม่มีค่าใช้จ่ายในแง่ของ CPU, หน่วยความจำหรือทรัพยากรอื่น ๆ (มันเป็นเรื่องเล็กน้อย)
อีกวิธีที่เป็นไปได้คือ "slurp" การป้อนข้อมูลลงในรายการ วนซ้ำในรายการเพื่อคำนวณผลรวมแล้วหารด้วยจำนวนรายการที่ถูกต้องจากรายการ
โดยการเปรียบเทียบวิธีการนี้อาจมีค่าใช้จ่ายจำนวนหน่วยความจำโดยพลการ
ในการดำเนินการที่ไม่ดีโดยเฉพาะอย่างยิ่งเราอาจดำเนินการผลรวมโดยใช้การเรียกซ้ำ แต่ไม่มีการกำจัดหาง ตอนนี้นอกเหนือจากโอเวอร์เฮดหน่วยความจำสำหรับรายการของเราแล้วเรายังแนะนำสแต็คโอเวอร์เฮด (ซึ่งเป็นหน่วยความจำประเภทอื่นและมักจะเป็นทรัพยากรที่ จำกัด กว่าหน่วยความจำรูปแบบอื่น ๆ )
อีกวิธีหนึ่ง (ไร้สาระที่มีเนื้อหามากกว่า) จะโพสต์อินพุตทั้งหมดไปยังตาราง SQL บางตัวใน RDBMS จากนั้นเรียกใช้ฟังก์ชัน SQL SUM บนคอลัมน์นั้นของตารางนั้น สิ่งนี้จะเลื่อนค่าใช้จ่ายหน่วยความจำท้องถิ่นของเราไปยังเซิร์ฟเวอร์อื่น ๆ และเกิดค่าใช้จ่ายเครือข่ายและการพึ่งพาภายนอกจากการดำเนินการของเรา (โปรดทราบว่าเซิร์ฟเวอร์ระยะไกลอาจมีหรือไม่มีหน่วยความจำโอเวอร์เฮดที่เกี่ยวข้องกับงานนี้ --- มันอาจผลักค่าทั้งหมดออกจากพื้นที่จัดเก็บทันที)
สมมุติฐานอาจพิจารณานำไปใช้กับบางกลุ่มของคลัสเตอร์ (อาจจะทำให้ค่าเฉลี่ยของค่านิยมหลายล้านล้านเป็นไปได้) ในกรณีนี้การเข้ารหัสและการกระจายของค่าใด ๆ ที่จำเป็น (การจับคู่ออกไปยังโหนด) และการรวบรวม / การเรียงของผลลัพธ์ (การลดขนาด) จะนับเป็นค่าใช้จ่าย
นอกจากนี้เรายังสามารถพูดคุยเกี่ยวกับค่าใช้จ่ายที่เกิดขึ้นจากปัจจัยที่เกินรหัสของโปรแกรมเมอร์ ตัวอย่างเช่นการรวบรวมโค้ดบางตัวสำหรับโปรเซสเซอร์ 32 หรือ 64 บิตอาจทำให้เกิดโอเวอร์เฮดมากกว่าที่จะเห็นสำหรับสถาปัตยกรรม 8 บิตหรือ 16 บิตเก่า สิ่งนี้อาจเกี่ยวข้องกับโอเวอร์เฮดของหน่วยความจำขนาดใหญ่ (ปัญหาการจัดตำแหน่ง) หรือโอเวอร์เฮดของ CPU (ซึ่ง CPU ถูกบังคับให้ปรับการเรียงบิตหรือใช้คำสั่งที่ไม่จัดชิด ฯลฯ ) หรือทั้งสองอย่าง
โปรดทราบว่าพื้นที่ดิสก์ที่ใช้งานโดยรหัสของคุณและเป็นห้องสมุด ฯลฯ มักจะไม่เรียกว่า "ค่าใช้จ่าย" แต่จะเรียกว่า "footprint" หน่วยความจำพื้นฐานที่โปรแกรมของคุณใช้ (โดยไม่คำนึงถึงชุดข้อมูลใด ๆ ที่กำลังประมวลผล) เรียกว่า "รอยเท้า" ของมันเช่นกัน
โอเวอร์เฮดนั้นใช้เวลามากขึ้นในการดำเนินการโปรแกรม ตัวอย่าง เมื่อเราเรียกใช้ฟังก์ชั่นและการควบคุมของมันจะถูกส่งผ่านไปตามที่กำหนดไว้และจากนั้นจะถูกประมวลผลร่างกายของมันหมายความว่าเราทำให้ซีพียูของเราทำงานผ่านกระบวนการที่ยาวนาน (ก่อนผ่านการควบคุมไปยังสถานที่อื่นในหน่วยความจำ ผ่านการควบคุมกลับไปที่ตำแหน่งเดิม) ดังนั้นจึงต้องใช้เวลาในการแสดงมากดังนั้นค่าโสหุ้ย เป้าหมายของเราคือการลดค่าใช้จ่ายนี้โดยใช้อินไลน์ในระหว่างการกำหนดฟังก์ชั่นและเวลาโทรซึ่งคัดลอกเนื้อหาของฟังก์ชั่นที่ฟังก์ชั่นการโทรดังนั้นเราจึงไม่ผ่านการควบคุมไปยังตำแหน่งอื่น .
คุณสามารถใช้พจนานุกรม ความหมายเหมือนกัน แต่เพื่อช่วยคุณประหยัดเวลาโอเวอร์เฮดเป็นงานที่ต้องใช้ในการทำงานที่ได้ผล ตัวอย่างเช่นอัลกอริทึมทำงานและทำงานที่มีประโยชน์ แต่ต้องใช้หน่วยความจำในการทำงาน การจัดสรรหน่วยความจำนี้ใช้เวลาและไม่เกี่ยวข้องโดยตรงกับงานที่ทำดังนั้นจึงเป็นค่าใช้จ่าย
ตัวอย่างที่เป็นรูปธรรมของค่าใช้จ่ายคือความแตกต่างระหว่างการเรียกขั้นตอน "ท้องถิ่น" และการเรียกขั้นตอน "ระยะไกล"
ตัวอย่างเช่นด้วย RPC แบบคลาสสิก (และเฟรมเวิร์กระยะไกลอื่น ๆ อีกมากมายเช่น EJB) การเรียกใช้ฟังก์ชันหรือเมธอดจะเหมือนกับ coder ไม่ว่าจะเป็นโลคอลการเรียกหน่วยความจำหรือการโทรผ่านเครือข่ายแบบกระจาย
ตัวอย่างเช่น:
service.function(param1, param2);
นั่นเป็นวิธีปกติหรือวิธีการทางไกลหรือไม่? จากสิ่งที่คุณเห็นที่นี่คุณไม่สามารถบอกได้
แต่คุณสามารถจินตนาการได้ว่าความแตกต่างในเวลาดำเนินการระหว่างสองสายนั้นน่าทึ่งมาก
ดังนั้นในขณะที่การดำเนินการหลักจะ "เสียค่าใช้จ่ายเท่าเดิม" แต่ค่าใช้จ่าย "ที่เกี่ยวข้อง" นั้นแตกต่างกันมาก
คิดเกี่ยวกับค่าใช้จ่ายเป็นเวลาที่จำเป็นในการจัดการกระทู้และประสานงานในหมู่พวกเขา เป็นภาระหากเธรดไม่มีงานเพียงพอที่จะทำ ในกรณีเช่นนี้ค่าใช้จ่ายที่มากกว่าจะมาถึงเวลาที่บันทึกผ่านการใช้เธรดและรหัสจะใช้เวลามากกว่าลำดับต่อเนื่อง
สิ่งอื่นนอกเหนือจากตัวข้อมูลเองเช่นค่าสถานะ tcp, ส่วนหัว, crc, fcs เป็นต้น