2012-05-17 9 views
11

Ciekawy temat reputed performance gains w xobotos, sprawdziłem drzewo binarne benchmark code.XobotOS: Dlaczego benchmark drzewa binarnego C# używa struktury struct?

wersja

Java z binary tree node jest:

private static class TreeNode 
{ 
    private TreeNode left, right; 
    private int item; 
} 

C# version jest:

struct TreeNode 
{ 
    class Next 
    { 
    public TreeNode left, right; 
    } 

    private Next next; 
    private int item; 
} 

Zastanawiam się, co zaletą korzystania struct tutaj jest, ponieważ następnego i poprzedniego wskaźników nadal są zamknięte w klasie.

Cóż, istnieją jeden-liści węzłów są czystymi typami wartości, ponieważ nie potrzebują lewej i prawej wskazówki. W typowym drzewie binarnym, w którym połowa węzłów to liście, oznacza to 50% zmniejszenie liczby obiektów. Mimo to wzrost wydajności jest znacznie większy.

Pytanie: Czy jest coś więcej?

Ponadto, ponieważ nie myślałem o zdefiniowaniu węzłów drzewa w ten sposób w języku C# (dzięki Xamarin!), Jakie inne struktury danych mogą skorzystać na użyciu struktur w nieoczywisty sposób? (Nawet jeśli jest to trochę nie na temat i nie jest otwarte).

+1

A jaki jest wzrost wydajności, o którym wspomniałeś? – leppie

+1

Patrząc teraz na kod, jest jasne, że ktoś skopiował go z kodu C, nie wiedząc dokładnie, co robi (a przynajmniej robiąc to w bardzo absurdalny sposób). – leppie

Odpowiedz

0

Umożliwia grupowanie dwóch węzłów w jedną alokację, w idealnej sytuacji zmniejszając o połowę liczbę przydziałów ogółem.

IMO sprawia, że ​​porównanie jest bez znaczenia.

-1

Nie sądzę, że użycie struct tutaj ma jakąkolwiek różnicę. Zwłaszcza po przejrzeniu kodu źródłowego TreeNode, gdzie instancje TreeNode są zawsze kopiowane w konstruktorze i rekurencyjnym wywołaniu bottomUpTree.

0

Struktury mogą być przydzielane na stosie zamiast sterty (nie w każdym przypadku), co oznacza, że ​​są one usuwane, gdy tylko wykroczą poza zakres - Garbage Collector nie angażuje się w ten scenariusz. Może to spowodować mniejszy nacisk na pamięć i mniej śmieci. Ponadto, stos jest (głównie) obszernym obszarem pamięci, więc dostęp do niego ma lepszą lokalizację, która może (ponownie prawdopodobnie) poprawić współczynnik trafień w pamięci podręcznej na poziomie procesora.

wytyczne Microsoft na choosing between classes and structures:

  • struktury powinny być małe (16 bajtów na ogół) i krótko
  • powinny być niezmienne

Jeżeli te są spełnione, wówczas za pomocą struktury nad klasa spowoduje wzrost wydajności.

1

Po prostu przebiegłem ten dziwny kod i miałem to samo pytanie. Jeśli zmienisz kod, aby pasował do wersji Java, będzie działał nieco wolniej. Wierzę, że większość 'struct TreeNode' zostanie otrzymana w pudełku i alokowana tak czy inaczej, z wyjątkiem dolnego rzędu. Jednak każdy węzeł daje 2 alokacje: Boxed TreeNode i klasa Next. Oszczędności alokacji szybko znikają. IMO, nie jest to odpowiednie użycie struktury.

+0

+1 za faktyczne sprawdzenie działania.Ponieważ ten wzorzec został opracowany specjalnie po to, by pochwalić się zaletami Mono na Java, uważam, że jest to prawdopodobnie powód. –