Dapatkah biaya GC diabaikan ketika menganalisis waktu berjalan dari struktur data kasus terburuk yang ditentukan dalam bahasa pemrograman yang dikumpulkan sampah?

22

Saya baru menyadari bahwa saya mengasumsikan jawaban untuk pertanyaan saya adalah "ya" tetapi saya tidak punya alasan yang bagus. Saya membayangkan bahwa mungkin ada pengumpul sampah yang terbukti hanya memperkenalkan pelambatan terburuk. Apakah ada referensi definitif yang bisa saya kutip? Dalam kasus saya, saya sedang mengerjakan struktur data yang berfungsi murni dan saya menggunakan ML Standar, jika perincian ini penting.O(1)

Dan mungkin pertanyaan ini akan lebih relevan ketika diterapkan pada struktur data yang ditentukan dalam, katakanlah, Java? Mungkin ada beberapa diskusi yang relevan dalam buku teks algoritma / struktur data yang menggunakan Java? (Saya tahu Sedgewick memiliki versi Java, tetapi saya hanya memiliki akses ke versi C.)

Maverick Woo
sumber

Jawaban:

17

Ya, gc adalah waktu konstan diamortisasi. Misalkan Anda memiliki algoritma yang berjalan untuk waktu dengan set kerja puncak ukuran k . Sekarang, perhatikan bahwa Anda dapat mengalokasikan paling banyak O ( n ) kata selama pelaksanaan program, dan bahwa biaya waktu menjalankan pengumpul sampah adalah O ( k ) (yaitu, biaya gc sebanding dengan total jumlah data langsung). Jadi jika Anda menjalankan gc paling banyak O ( n / k ) kali, maka total biaya runtime dibatasi oleh O ( n )nkO(n)O(k)O(n/k)O(n), yang berarti bahwa biaya perolehan diamortisasi dari gc adalah konstan. Jadi jika Anda memiliki kolektor gaya Cheney, dengan masing-masing ruang semisal berukuran , maka mudah untuk melihat bahwa koleksi lengkap tidak dapat dipanggil lebih dari sekali setiap langkah n / k , karena mengalokasikan kata k membutuhkan O ( k ) waktu, dan set kerja tidak pernah melebihi ukuran k , yang memberi Anda batas yang Anda inginkan. Ini membenarkan mengabaikan masalah gc.2kn/kkO(k)k

Namun, satu kasus di mana ada atau tidak adanya gc tidak diabaikan adalah ketika menulis struktur data bebas kunci. Banyak struktur data bebas kunci modern dengan sengaja membocorkan memori dan mengandalkan gc untuk mendapatkan kebenaran. Ini karena pada level tinggi, cara mereka bekerja adalah menyalin beberapa data, mengubahnya, dan mencoba memperbaruinya secara atomis dengan instruksi CAS, dan menjalankannya dalam satu lingkaran sampai CAS berhasil. Menambahkan deinokasi deterministik ke algoritma ini membuatnya jauh lebih kompleks, sehingga orang sering tidak repot (terutama karena mereka sering ditargetkan pada lingkungan seperti Java).

EDIT: Jika Anda ingin batas yang tidak diamortisasi, kolektor Cheney tidak akan melakukannya - pemindaian seluruh set langsung setiap kali dipanggil. Kata kunci untuk google adalah "pengumpulan sampah waktu nyata", dan Djikstra et al. dan Steele memberikan kolektor tanda dan sapuan waktu nyata pertama, dan Baker memberikan waktu pemadatan gc yang nyata.

@artikel {dijkstra1978fly,
  title = {{Pengumpulan sampah sambil jalan: Latihan bersama}},
  author = {Dijkstra, EW dan Lamport, L. dan Martin, AJ dan Scholten, CS and Steffens, EFM},
  jurnal = {Komunikasi ACM},
  volume = {21},
  number = {11},
  halaman = {966--975},
  issn = {0001-0782},
  tahun = {1978},
  publisher = {ACM}
}

@artikel {steele1975multiproses,
  title = {{Mengolah pengumpulan sampah pemadatan}},
  author = {Steele Jr, GL},
  jurnal = {Komunikasi ACM},
  volume = {18},
  number = {9},
  halaman = {495--508},
  issn = {0001-0782},
  tahun = {1975},
  publisher = {ACM}
}

@article {baker1978list,
  title = {{Daftar memproses secara real time di komputer serial}},
  author = {Baker Jr, HG},
  jurnal = {Komunikasi ACM},
  volume = {21},
  number = {4},
  halaman = {280--294},
  issn = {0001-0782},
  tahun = {1978},
  publisher = {ACM}
}
Neel Krishnaswami
sumber
abab
1
"Ya, gc diamortisasi waktu konstan". Ini tidak benar secara umum. Anda mungkin berpendapat bahwa GC bisa tetapi mereka belum tentu dan yang nyata tentu tidak. Sebagai contoh, naif List.mapdalam OCaml sebenarnya kompleksitas kuadratik karena kedalaman tumpukan linear dan tumpukan dilintasi setiap kali pembibitan dievakuasi. Hal yang sama berlaku untuk irisan besar yang menghadapi array besar pointer.
Jon Harrop
12

O(n)

O(1)

Referensi pengumpulan sampah definitif adalah:

  • Pengumpulan Sampah oleh Richard Jones dan Rafael Lin

Ben Zorn melakukan beberapa pekerjaan mengukur biaya aktual dari algoritma pengumpulan sampah yang berbeda, meskipun berikut ini makalah yang lebih baru menyajikan perbandingan yang jauh lebih komprehensif:

Untuk lebih lanjut lihat:

Dave Clarke
sumber