Jeśli istnieje połączona lista z 4 mln+ węzłów, czy faza oznaczania musi za każdym razem przechodzić przez całą listę, aby zbudować wykres? Czy w tym przypadku są stosowane jakieś optymalizacje? Na pierwszy rzut oka nie wygląda to wydajnie. Czy istnieje sposób na sprawdzenie, czy GC przechodzi przez całą listę, czy nie?
TIA.
3 odpowiedzi
Tak, będzie musiał przejść przez cały wykres obiektu. Szczerze mówiąc, nie mogę sobie wyobrazić, jak mogłyby istnieć jakiekolwiek optymalizacje ... ale nie trzeba wiele robić na każdym węźle. Podejrzewam, że większość czasu spędzimy czekając na pamięć, ponieważ oczywiście przepali ona pamięć podręczną. Oczywiście, zanim połączona lista znajdzie się w gen2 (a jeśli alokujesz miliony węzłów, większość z nich będzie dość szybko w gen2), będzie musiał to robić bardzo rzadko.
Jeśli jest to najbardziej rozsądna struktura danych dla Twojej aplikacji, użyłbym jej w tej chwili, ale śledzę spadek wydajności związany z odśmiecaniem za pomocą Monitora wydajności itp. Jeśli okaże się to problemem, możesz rozważyć alternatywne strategie.
Co powiedział Jon.
Ponadto, gdy obiekt trafi do Gen2, dostępna optymalizacja (w systemie Windows, ale nie na innych platformach IIRC) polega na tym, że GC może zarejestrować się w jądrze, aby otrzymywać powiadomienia do danej strony pamięci. W przypadkach, gdy strona pozostaje niezmieniona między wydarzeniami GC, niektóre prace nie muszą być powtarzane.
Dokonuje się jednej bardzo ważnej optymalizacji. .NET GC jest generacyjny, a dane w gen2 są rzadko przeszukiwane.
Przy dużych strukturach danych (takich jak ogromne połączone listy) większość danych szybko trafi do gen2, gdzie GC będzie miał do nich dostęp rzadko.
Ponadto GC przeszukuje tylko dane na żywo podczas zbierania, dane martwe są zbierane „za darmo”. Więc kiedy twoja lista stanie się nieosiągalna (lub jeśli większość jej węzłów, ale nie wszystkie, jest), wtedy GC będzie w stanie zebrać miliony węzłów w zasadzie za darmo.
Podobne pytania
Nowe pytania
c#
C # (wymawiane „patrz ostro”) jest językiem programowania wysokiego poziomu, statycznie typowanym, wieloparadygmatowym opracowanym przez firmę Microsoft. Kod C # zwykle jest przeznaczony dla rodziny narzędzi Microsoft .NET i czasów wykonywania, do których należą między innymi .NET Framework, .NET Core i Xamarin. Użyj tego tagu w przypadku pytań dotyczących kodu napisanego w C # lub C # formalnej specyfikacji.