2012-07-30 10 views
6

Mam zmienną klasę, która ma prywatne pole List<T> wewnątrz. W metodzie Reset() mojej klasy powinienem wyczyścić listę przy użyciu jej metody Clear() lub po prostu przypisać jej pole do nowej listy? Zauważ, że lista nie jest publiczna i jest używana tylko przez samą klasę. Przypisanie nowej listy powinno sprawić, że stara się nieosiągalna. Od czasu Clear() metoda is an O(n) operation, zastanawiam się, co jest wadą po prostu przypisanie nowej listy nad nim.Czy usunąć prywatną kolekcję lub ustawić ją na wartość null?

Odpowiedz

5

Jedyną wadą, o której mogę myśleć, jest to, że jeśli chcesz ponownie użyć tej listy, musisz przydzielić jej nowe miejsce.

Po jego usunięciu lista i jej zawartość (przy założeniu, że nie ma żadnych innych referencji) kwalifikują się do GC. Wyczyszczenie spowoduje usunięcie elementów, ale pozostawi przydział pamięci.

Osobiście mam tendencję do zerowania rzeczy, nawet jeśli będę jej potrzebować ponownie, rozmiar zmieni się całkowicie.

Aktualizacja: Odnosząc się do poniższych komentarzy, można stwierdzić, że obiekty te będą zarządzane w puli obiektów. Radziłbym stworzyć małą aplikację konsolową, aby uzyskać ostateczną odpowiedź. Dyskusja przechodzi teraz do specyfiki implementacji i zamierzonego wykorzystania puli obiektów, co może z łatwością zmienić odpowiedź.

Ogólnie rzecz biorąc, jeśli masz listy, które nie zmieniają się zbyt długo i zawsze będą wymagane, użyłbym Clear, aby uniknąć przydzielania nowej pamięci dla list. Jeśli długość listy jest podatna na wiele zmian, lub użycie jest czasem rzadkie - wolałbym ją anulować, aby odzyskać pamięć i zyskać drobne korzyści poprzez leniwe tworzenie list.

+0

Więc jeśli mam listę bajtów z 2k bajtów, co byłoby szybsze? Ja, wywołując Clear lub GC, dokonując realokacji? Pytam o to, ponieważ mam około 1-2 tys. Obiektów z tymi listami w środku, więc chcę mieć pewność, co byłoby lepsze, pod względem wydajności. –

+0

@ d4wn Osobiście nie martwiłbym się o wydajność, dopóki nie udowodnisz, że to problem. To zależy od tego, co chcesz zrobić z listą. Jeśli elementy nie są już potrzebne, ale prawdopodobnie potrzebujesz rozmiaru listy lub chcesz uniknąć ponownego przydzielania pamięci w celu zwiększenia listy, powinienem użyć opcji "Wyczyść". Jeśli później nie dbasz o listę lub bardzo się skurczysz, to 'list = null; lista = nowa lista () '. W obu przypadkach GC zbierze x-wiele obiektów, więc nie ma to znaczenia. Wszelkie potencjalne różnice wydajności będą stanowić różnicę pomiędzy ponowną alokacją O (n) a ponowną alokacją wzrostu listy. –

+0

Jeszcze jedno pytanie: dlaczego miałbym chcieć "uniknąć ponownej alokacji pamięci do wzrostu listy"? Używam puli dla tych obiektów, będą one ponownie wykorzystywane wielokrotnie, dopóki aplikacja będzie działać. Reedycja za każdym razem brzmi drogo, ale nie wiem zbyt wiele o GC i jak bardzo ten proces może wpłynąć na wydajność. –

0

Dlaczego więc zerować? To załatwi dla Ciebie, pozwalając starej listy pobyt na stercie do zbierania śmieci, a istniejące metody, że dostęp do listy może nadal działać na nowej, pustej listy:

this.FooList = new List<Foo>(); 
+1

Napisałem również "przypisywanie jej pola do nowej listy". Powodem, dla którego użyłem słowa "nullifying", jest to, że czyni pole niedostępnym i pozwala GC je zebrać. Ale masz rację, powinienem edytować pytanie. W każdym razie pytanie było, która byłaby szybsza i jakie wady/zalety mają nad innymi. –

+0

Nulling to lub ponowne przypisanie to samo w oczach GC. Jeśli ją usuniesz i ponownie przypiszesz później, otrzymasz łagodną korzyść z leniwego tworzenia instancji. –

0

Po Reset połączeń I pozostawiłby obiekt w tym samym stanie, w jakim znajdował się po wywołaniu konstruktora.

Jeśli twój konstruktor stworzył nowy pusty List, zrób to. Jeśli nie, zrób to null.

+0

To właśnie próbuję podjąć decyzję. Ustaw listę raz w konstruktorze i używaj jej w kółko, usuwając ją lub twórz leniwie, jeśli jest taka potrzeba, i ustaw ją na wartość zerową (lub na nową listę) w Reset. –

+0

@ d4wn Moim zdaniem nie sądzę, że wydajność powinna wpłynąć na tę decyzję. Myślę, że zrobienie tego "null" i leniwe ładowanie jest najczystsze. – ForkandBeard

Powiązane problemy