"ค่าใช้จ่าย" คืออะไร?


149

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


27
คุณต้องทำ "สิ่งพิเศษ" ให้มากเพื่อที่จะได้อะไร เช่นถ้าฉันต้องโหลดโปรเจ็กต์คลาส 37 เพื่อพิมพ์ "Hello World" ฉันจะพิจารณาว่ามีค่าใช้จ่ายมากมาย
scunliffe

1
@ doug65536 จริงๆแล้วมันเป็นวิธีอื่น =)
Yukio Fukuzawa

คำตอบ:


177

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

เหมือนเมื่อคุณต้องไปที่ไหนสักแห่งคุณอาจต้องการรถยนต์ แต่มันจะมีค่าใช้จ่ายมากมายในการขับรถไปตามถนนดังนั้นคุณอาจต้องการเดิน อย่างไรก็ตามค่าโสหุ้ยจะคุ้มถ้าคุณเดินทางข้ามประเทศ

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


84
การเปรียบเทียบที่คล้ายกันจะเป็นการบิน เครื่องบินเร็วกว่ารถยนต์มาก แต่ค่าใช้จ่ายในการเช็คอินสนามบินความปลอดภัย ฯลฯ ทำให้รถยนต์เป็นตัวเลือกที่ดีกว่าสำหรับระยะทางที่สั้นกว่า
FogleBird

s / drive / go / (หากคุณต้องการขับรถไปที่ไหนสักแห่งคุณมักจะไม่ตัดสินใจเดิน ...
RCIX

1
@ inf3rno ประชด? เราจะไปที่รถของเราได้อย่างไร? เราเดิน. และเราสามารถเดิน ... ไปที่รถของเราโดยสิ้นเชิง เราไม่สามารถเดินไปยังจุดหมายปลายทางของเราได้แม้ว่าจะอยู่ใกล้กับรถของเรามากขึ้นก็ตาม
corsiKa

ถ้าฉันจะบอกว่าฉันเขียนรหัส java ค่าใช้จ่ายต่ำคุณจะตีความว่าในแง่ของคำจำกัดความของ "ทรัพยากรที่จำเป็นในการตั้งค่าการดำเนินงาน" รหัสของฉันไม่ต้องการการตั้งค่ามากนัก?
committedandroider

คุณต้องเปิดเครื่องคอมพิวเตอร์หรือเซิร์ฟเวอร์คุณต้องโหลดระบบปฏิบัติการและไดรเวอร์ทั้งหมดคุณต้องเริ่มกระบวนการ Java คุณต้องเปิด JVM คุณต้องโหลดคลาสทั้งหมดของคุณ ต้องซิงโครไนซ์บัฟเฟอร์ IO กับคอนโซลเพียงเพื่อให้คุณสามารถทำ "สวัสดีโลก" ของคุณ แต่โปรดบอกฉันเพิ่มเติมเกี่ยวกับการเขียนรหัสค่าโสหุ้ยต่ำ
corsiKa

40

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

  • ค่าใช้จ่ายในโพรโทคอล : เฟรมอีเทอร์เน็ตแพ็คเก็ต IP และ TCP เซ็กเมนต์ทั้งหมดมีส่วนหัวการเชื่อมต่อ TCP ต้องใช้แพ็คเก็ตจับมือกัน ดังนั้นคุณไม่สามารถใช้แบนด์วิดท์ทั้งหมดที่ฮาร์ดแวร์สามารถใช้สำหรับข้อมูลจริงของคุณ คุณสามารถลดค่าใช้จ่ายโดยใช้ขนาดแพ็กเก็ตที่ใหญ่กว่าและ UDP มีส่วนหัวที่เล็กกว่าและไม่มีการจับมือกัน
  • ค่าใช้จ่ายหน่วยความจำโครงสร้างข้อมูล : รายการที่เชื่อมโยงต้องมีตัวชี้อย่างน้อยหนึ่งตัวสำหรับแต่ละองค์ประกอบที่มี หากองค์ประกอบมีขนาดเดียวกับตัวชี้นี่หมายถึงค่าใช้จ่ายหน่วยความจำ 50% ในขณะที่อาร์เรย์อาจมีค่าใช้จ่าย 0%
  • เมธอดโอเวอร์เฮดการเรียกใช้ : โปรแกรมที่ออกแบบมาอย่างดีจะแบ่งออกเป็นวิธีการสั้น ๆ มากมาย แต่การเรียกใช้เมธอดแต่ละครั้งต้องตั้งค่ากรอบสแต็กคัดลอกพารามิเตอร์และที่อยู่ผู้ส่ง สิ่งนี้แสดงให้เห็นถึงค่าใช้จ่าย CPU เทียบกับโปรแกรมที่ทำทุกอย่างในฟังก์ชั่นเสาหินเดียว แน่นอนความสามารถในการบำรุงรักษาที่เพิ่มขึ้นทำให้มันคุ้มค่ามาก แต่ในบางกรณีการเรียกใช้เมธอดที่มากเกินไปอาจส่งผลกระทบต่อประสิทธิภาพที่สำคัญได้

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

Re ค่าใช้จ่ายโครงสร้างข้อมูลหน่วยความจำ: ด้วยตัวจัดสรรหน่วยความจำส่วนใหญ่มันยิ่งแย่ไปกว่านั้น แต่ละค่าที่ส่งคืนโดยmallocมีค่าใช้จ่ายในตัว 8 ไบต์เนื่องจากตัวจัดสรร (สมมติว่าเครื่อง 32 บิตแบบคลาสสิก) ประกอบด้วยขนาดของบล็อกบวกค่าป้องกัน และนั่นคือก่อนที่คุณจะนึกถึงการจัดสรรอย่างละเอียด รายการที่เชื่อมโยงเดี่ยว ๆ ของจำนวนเต็ม 4 ไบต์แบบง่ายจะมีค่าใช้จ่าย 75%; อาร์เรย์จะดีกว่ามาก (นอกเสียจากว่าคุณต้องการการแทรกที่รวดเร็วที่ตรงกลาง) เนื่องจากพวกเขาสามารถมีโอเวอร์เฮดหนึ่งครั้ง (หรือน้อยกว่าหากอาร์เรย์ไม่ได้ถูกจัดสรรแบบไดนามิก)
Donal Fellows

19

คุณเหนื่อยและไม่สามารถทำงานได้อีกต่อไป คุณกินอาหาร พลังงานที่ใช้ในการมองหาอาหารได้มาและกินจริง ๆ กินพลังงานและค่าใช้จ่าย!

ค่าใช้จ่ายเป็นสิ่งที่สูญเปล่าเพื่อให้งานสำเร็จ เป้าหมายคือการทำให้ค่าใช้จ่ายเล็กมาก

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


17

เราครอบคลุม Wikipedia :

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


4
แต่ถ้ามันไม่เป็นเช่นนั้นคุณจะต้องแก้ไข WikiPedia จากนั้นสร้างโพสต์เดียวกันที่นี่
SamGoody

11

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

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


5

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

ตัวอย่างเช่นเราอาจบอกว่าวิธีการเฉพาะอาจมีค่าใช้จ่าย CPU จำนวนมากในขณะที่อีกวิธีหนึ่งอาจมีค่าใช้จ่ายหน่วยความจำเพิ่มเติมและอีกวิธีหนึ่งอาจถ่วงน้ำหนักค่าใช้จ่ายเครือข่าย (และยกตัวอย่างเช่นการพึ่งพาภายนอก)

ให้ตัวอย่างที่เฉพาะเจาะจง: คำนวณค่าเฉลี่ย (ค่าเฉลี่ยเลขคณิต) ของชุดตัวเลข

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

วิธีการนี้ไม่มีค่าใช้จ่ายในแง่ของ CPU, หน่วยความจำหรือทรัพยากรอื่น ๆ (มันเป็นเรื่องเล็กน้อย)

อีกวิธีที่เป็นไปได้คือ "slurp" การป้อนข้อมูลลงในรายการ วนซ้ำในรายการเพื่อคำนวณผลรวมแล้วหารด้วยจำนวนรายการที่ถูกต้องจากรายการ

โดยการเปรียบเทียบวิธีการนี้อาจมีค่าใช้จ่ายจำนวนหน่วยความจำโดยพลการ

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

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

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

นอกจากนี้เรายังสามารถพูดคุยเกี่ยวกับค่าใช้จ่ายที่เกิดขึ้นจากปัจจัยที่เกินรหัสของโปรแกรมเมอร์ ตัวอย่างเช่นการรวบรวมโค้ดบางตัวสำหรับโปรเซสเซอร์ 32 หรือ 64 บิตอาจทำให้เกิดโอเวอร์เฮดมากกว่าที่จะเห็นสำหรับสถาปัตยกรรม 8 บิตหรือ 16 บิตเก่า สิ่งนี้อาจเกี่ยวข้องกับโอเวอร์เฮดของหน่วยความจำขนาดใหญ่ (ปัญหาการจัดตำแหน่ง) หรือโอเวอร์เฮดของ CPU (ซึ่ง CPU ถูกบังคับให้ปรับการเรียงบิตหรือใช้คำสั่งที่ไม่จัดชิด ฯลฯ ) หรือทั้งสองอย่าง

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


3

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


2

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


1

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


1

ตัวอย่างที่เป็นรูปธรรมของค่าใช้จ่ายคือความแตกต่างระหว่างการเรียกขั้นตอน "ท้องถิ่น" และการเรียกขั้นตอน "ระยะไกล"

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

ตัวอย่างเช่น:

service.function(param1, param2);

นั่นเป็นวิธีปกติหรือวิธีการทางไกลหรือไม่? จากสิ่งที่คุณเห็นที่นี่คุณไม่สามารถบอกได้

แต่คุณสามารถจินตนาการได้ว่าความแตกต่างในเวลาดำเนินการระหว่างสองสายนั้นน่าทึ่งมาก

ดังนั้นในขณะที่การดำเนินการหลักจะ "เสียค่าใช้จ่ายเท่าเดิม" แต่ค่าใช้จ่าย "ที่เกี่ยวข้อง" นั้นแตกต่างกันมาก


1

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


-2

สิ่งอื่นนอกเหนือจากตัวข้อมูลเองเช่นค่าสถานะ tcp, ส่วนหัว, crc, fcs เป็นต้น

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