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.

1
Paramesh 14 czerwiec 2011, 10:22

3 odpowiedzi

Najlepsza odpowiedź

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.

2
Jon Skeet 14 czerwiec 2011, 10:24

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.

2
Drew Noakes 14 czerwiec 2011, 10:28

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.

2
jalf 14 czerwiec 2011, 11:51