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
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.
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>();
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. –
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. –
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
.
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. –
@ 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
- 1. Dlaczego nie usunąć ustawić wskaźnik na NULL?
- 2. Jak sprawdzić, czy zmienna ma wartość NULL, a następnie ustawić ją za pomocą procedury składowanej MySQL?
- 3. Czy można ustawić prywatną zmienną w Rust?
- 4. Jak ustawić wartość na wartość NULL podczas korzystania z Zend_Db
- 5. Czy można ustawić prywatną własność poprzez odbicie?
- 6. Jawnie ustawić wartość kolumny na wartość null SQL Developer
- 7. Jeśli chcesz wymusić usuwanie śmieci na zmiennej w JavaScript, czy lepiej ustawić ją jako null lub undefined?
- 8. JPA jeden do wielu usunąć i ustawić klucz foregn na wartość null
- 9. Jak usunąć wartość null w json ciąg
- 10. Czy mogę ustawić wartość null jako wartość domyślną dla @Value na wiosnę?
- 11. Jak ustawić bieżący rekord źródła BindingSource na wartość null?
- 12. Jak ustawić zmienną daty na wartość null w VB.NET
- 13. Jak ustawić dzielnik (na wartość null) niestandardowego układu ListFragment
- 14. ustawić tło jako NULL
- 15. C# - IComparer - Jeśli datetime ma wartość null, należy posortować ją na dół, nie na górę
- 16. Zastąp, a następnie ustaw na wartość null
- 17. Jak sprawdzić, czy datatable ma wartość Null lub Nic?
- 18. Definiowanie „nieznany” lub wartość „null” w enum
- 19. Jak ustawić kolekcję w linii?
- 20. Jak ustawić CONTEXT_INFO = NULL?
- 21. Czy javax.persistence.Query.getResultList() zwróci wartość null?
- 22. Jak sprawdzić, czy tablica asocjacyjna ma pusty lub wartość null
- 23. Jak mogę uniemożliwić kolumnę, aby zezwolić na wartość null, a kolumna Zezwalaj na wartość Null nie zezwalać na wartość null
- 24. który ma lepszą wydajność:! Test = null lub wartość null = test
- 25. php: napisać Isset funkcję, która zwraca wartość lub wartość null
- 26. Dlaczego ten bitowy LUB zwraca wartość null na int nullable?
- 27. ALTER TABLE nie pozwala ustawić wartości NULL lub domyślnej?
- 28. Sharepoint DateTimeControl: ustaw na wartość null
- 29. zamień wartość NULL na wartość pustą lub zero w serwerze sql
- 30. Jak sprawdzić, czy wartość kolumny ma wartość NULL lub ma wartość domyślną w Mysql
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. –
@ 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. –
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ść. –