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


22

ฉันเพิ่งรู้ว่าฉันได้สมมติว่าคำตอบสำหรับคำถามของฉันคือ "ใช่" แต่ฉันไม่มีเหตุผลที่ดี ฉันคิดว่าอาจมีตัวเก็บขยะที่แนะนำการชะลอตัวของกรณีเลวร้ายที่สุดเท่านั้น มีการอ้างอิงที่ชัดเจนที่ฉันสามารถอ้างอิงได้หรือไม่? ในกรณีของฉันฉันกำลังทำงานกับโครงสร้างข้อมูลที่ใช้งานได้จริงและฉันใช้ Standard ML หากรายละเอียดเหล่านี้มีความสำคัญO(1)

และบางทีคำถามนี้อาจมีความเกี่ยวข้องมากขึ้นเมื่อนำไปใช้กับโครงสร้างข้อมูลที่ระบุใน, พูด, Java? อาจมีการอภิปรายที่เกี่ยวข้องในตำราเรียนอัลกอริทึม / โครงสร้างข้อมูลที่ใช้ Java? (ฉันรู้ว่า Sedgewick มีรุ่น Java แต่ฉันสามารถเข้าถึงรุ่น C เท่านั้น)

คำตอบ:


17

ใช่ gc ถูกตัดจำหน่ายเวลาคงที่ สมมติว่าคุณมีอัลกอริทึมที่วิ่งเวลามียอดชุดทำงานขนาดk ตอนนี้โปรดทราบว่าคุณสามารถจัดสรรคำได้มากที่สุดO ( n )คำในระหว่างการทำงานของโปรแกรมและค่าใช้จ่ายเวลาในการเรียกใช้ตัวเก็บรวบรวมขยะที่คัดลอกคือO ( k ) (เช่นต้นทุนของ gc เป็นสัดส่วนกับผลรวมทั้งหมด จำนวนข้อมูลสด) ดังนั้นหากคุณรัน gc มากที่สุดO ( n / k )ครั้งดังนั้นต้นทุนรันไทม์ทั้งหมดจะถูก จำกัด ด้วยO ( n )nkO(n)O(k)O(n/k)O(n)ซึ่งหมายความว่าค่าตัดจำหน่ายของ gc คงที่ ดังนั้นหากคุณมีนักสะสมสไตล์ Cheney โดยแต่ละเซสเปซเป็นขนาดดังนั้นจึงเป็นเรื่องง่ายที่จะเห็นว่าคอลเลกชันเต็มไม่สามารถเรียกได้มากกว่าหนึ่งครั้งในทุก ๆขั้นตอนn / kเนื่องจากการจัดสรรkคำใช้O ( k )เวลาและชุดการทำงานไม่เคยเกินขนาดkซึ่งให้ขอบเขตที่คุณต้องการ นี่เป็นเหตุผลที่ละเว้นปัญหา gc2kn/kkO(k)k

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

แก้ไข: หากคุณต้องการขอบเขตที่ไม่มีการตัดจำหน่ายตัวเก็บรวบรวม Cheney จะไม่ทำเช่นนั้นมันจะทำการสแกนชุดสดทั้งหมดในแต่ละครั้งที่เรียกใช้ คำหลักที่ Google ใช้คือ "การรวบรวมขยะแบบเรียลไทม์" และ Djikstra et al และสตีลให้นักสะสมมาร์คและกวาดแบบเรียลไทม์เป็นครั้งแรกและเบเคอร์ได้มอบ gc แบบเรียลไทม์เป็นครั้งแรก

@article {dijkstra1978fly,
  title = {{การเก็บขยะแบบทันที: การออกกำลังกายในความร่วมมือ}},
  ผู้เขียน = {Dijkstra, EW และ Lamport, L. และ Martin, AJ และ Scholten, CS และ Steffens, EFM}
  journal = {การสื่อสารของ ACM}
  = ปริมาณ {21}
  = จำนวน {11}
  หน้า = {966--975}
  ISSN 0001-0782 = {}
  = ปี 1978 {}
  สำนักพิมพ์ = {} ACM
}

@article {steele1975multiprocessing,
  title = {{การประมวลผลหลายขั้นตอนการรวบรวมขยะแบบย่อ}},
  ผู้เขียน = {Steele Jr, GL},
  journal = {การสื่อสารของ ACM}
  = ปริมาณ {18}
  = จำนวน {9}
  หน้า = {495--508}
  ISSN 0001-0782 = {}
  = ปี 1975 {}
  สำนักพิมพ์ = {} ACM
}

@article {baker1978list,
  title = {{การประมวลผลรายการแบบเรียลไทม์บนคอมพิวเตอร์อนุกรม}},
  ผู้เขียน = {Baker Jr, HG},
  journal = {การสื่อสารของ ACM}
  = ปริมาณ {21}
  = จำนวน {4}
  หน้า = {280--294}
  ISSN 0001-0782 = {}
  = ปี 1978 {}
  สำนักพิมพ์ = {} ACM
}

abab

1
"ใช่ gc ถูกตัดจำหน่ายเวลาคงที่" สิ่งนี้ไม่เป็นความจริงโดยทั่วไป คุณอาจโต้แย้งว่า GC สามารถเป็นได้ แต่พวกเขาไม่จำเป็นและคนจริงไม่ได้แน่นอน ตัวอย่างเช่นความไร้เดียงสาList.mapใน OCaml นั้นจริง ๆ แล้วมีความซับซ้อนเป็นกำลังสองเนื่องจากความลึกของสแต็กเป็นเชิงเส้นและสแต็คจะถูกสำรวจทุกครั้งที่มีการอพยพ เช่นเดียวกันสำหรับชิ้นใหญ่ ๆ ที่พบกับอาร์เรย์ขนาดใหญ่ของพอยน์เตอร์
Jon Harrop

12

O(n)

O(1)

การอ้างอิงการรวบรวมขยะที่ชัดเจนคือ:

  • การเก็บขยะโดย Richard Jones และ Rafael Lin

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

ดูเพิ่มเติมที่:

  • ทฤษฎีการรวบรวมขยะแบบครบวงจรเบคอนเฉิง & ราชาการประชุม ACM เรื่องการเขียนโปรแกรมเชิงวัตถุระบบภาษาและการใช้งานแวนคูเวอร์บริติชโคลัมเบียแคนาดาหน้า 50-68, 2004
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.