2011-03-01 26 views
26

Tüketicimdeki bir BlockingQueue'yi boşaltmak için bir LinkedList kullandığım için, üzerinde çalıştığım bir projede LinkedList.Clear() öğesinin O (1) olduğunu varsayıyordum Bu, yüksek bir verime ihtiyaç duyuyor, daha sonra LinkedList'i temizliyor ve yeniden kullanıyor. Neden LinkedList.Clear() O değil (1)

(OpenJDK) kodu yaptığı gibi bu varsayım, yanlış çıkıyor bu: Bu biraz şaşırtıcı
Entry<E> e = header.next; 
    while (e != header) { 
     Entry<E> next = e.next; 
     e.next = e.previous = null; 
     e.element = null; 
     e = next; 
    } 

vardır basitçe kendi başlığını "unutmak" could not herhangi bir sebep LinkedList.Clear .next ve header.previous üye?

// Clearing all of the links between nodes is "unnecessary", but: 
// - helps a generational GC if the discarded nodes inhabit 
// more than one generation 
// - is sure to free memory even if there is a reachable Iterator 

makul açıkça niçin yaptıklarını:

+1

http://www.docjar.com/html/api/java/util/LinkedList.java.html Harmony o O (1), burada bulabileceğiniz – Bozho

+1

İyi açıklama vardır/575995/clear-impl-in-Javas'ın-LinkedList. Tarafından cevaplandı Jason – smas

cevap

31

Eclipse (1.7.0-ea-B84'ün inşa) bakıyorum sürümünde kaynak kodu üstlerinde Bu yorumu var Buna rağmen, bir O (1) işlemini O (n) 'ye dönüştürdüğüne dair biraz endişe verici olduğunu kabul ediyorum.

+0

Tamam, teşekkürler - bu yorumlar 1,6 kaynakta vardı :-) – Leri

+2

Sadece tüm düğümlerin RAM'de olan sayfalarda olmasını umalım .... –

+0

Bu problemi gördüğüm tek çözüm Sınıfı özel bir açık yöntemle genişletmek olurdu. Doğru olması zor değil (orijinal uygulamadan sonra göz atabilir ve tekrarlamayı kaldırabilirsiniz), ama yine de yapmak istediğim bir şey değil. Kötü API tasarımı imho. – Voo

0

Yanıtlar hakkında yorum yapamıyorum gibi görünüyor (?): Sonraki ve önceki arasındaki işaretçiler önemli değil. İç girdilerin hiçbiri herhangi bir GC kökünden erişilemeyeceğinden, tüm yapı toplanacaktır. Java bir referandum toplayıcısı kullandıysa, döngü problemine takılırdık.

Doğru cevaplar John Skeet'in notlarıdır. Ben GC optimizasyonu nedeniyle çok etkilendim değilim ederken

3

-

takas ve doğru gelmiyor LinkedList

yeniden - bu açıkça durumda geri teper. Neden sadece yeni bir LinkedList nesnesi yaratmıyorsunuz? http://stackoverflow.com/questions:

+0

Eski listeden kısmen giriş düğümlerinden birine yapılan bir başvuru, eski listeyi görmeye devam edecek ve bunun üzerinden devam edebilmeye devam edecektir. (Bu, yorumun ikinci kısmı ile ilgilidir ve GC ile ilgisi yoktur.) – Oddthinking

+0

açıkça op, listeye başka bir referans içermez. – irreputable

+0

Burada yeni bir BağlantılıListesi oluşturmanın tüm sorundan kurtulması doğru. Sonunda aslında bir ArrayList'e geçtim, o zaman net() O (N), hala daha iyi performans göstermesi için ölçtük, özel durumumuz için, toplanan çöp topluluğumuzu 150-200Mb/sn'lik çöpün tek başına iç bağlantılı liste düğümleri (Normalde bu gibi şeyler umursamayız, ama bu özel uygulama için) bu doğru olanı için – Leri