2012-03-29 14 views
6

Programuję grę przy użyciu C#, w związku z tym jestem bardzo zaniepokojony osiągami.Klasa VS ref Struct

Chciałbym wiedzieć, jakie są główne różnice, a jeśli to możliwe, kwestie związane z wydajnością korzystania z klasy do przekazywania danych w pobliżu lub ze struktury przekazanej przez odniesienie.

Nie chcę kopiować danych, ze względu na wydajność (przypuszczam, że przekazanie przez ref jest znacznie szybsze niż tutaj).

Wiem, że klasa jest zawsze przekazywane przez odniesienie i że struct jest przekazywana przez wartość, ale mówię o przekazywanie struktury przez odniesienie tutaj.

Przykładem danych pragnę przekazać:

public delegate void PathCompleteDelegate(List<PathFinderNode> path); 
public struct PathFinderJob{ 
    public PathCompleteDelegate callback; 
    public Vector3 start, end; 
    public PathSize unitSize; 
    public BoxCollider boxCollider; 
} 

W poprzednim przykładzie, stosując klasa zrobić różnicę? Jeśli tak, jaka byłaby różnica? Czy w tym przykładzie klasa byłaby szybsza niż struktura? Czemu?

Dziękuję. Joao Carlos

+1

Czy próbowałeś profilowania wydajności obu metod? Jeśli struktura ma zasięg poza metodą, to i tak będzie na kupie (jak w, zawartej w klasie na stercie). Podejrzewam, że klasa lub ref struct mają taką samą wydajność w zakresie wywołań metod. –

+0

Nie mam dużego doświadczenia profilowania i zrobiłem szybkie sprawdzanie profilowania przy użyciu wbudowanego profilera Unity3D, ale nie widziałem różnicy, jednak nie wiem, jak dobrze wbudowany profiler jest z tego typu "małą rybką" lub jeśli w ogóle zobaczy różnicę między wszystkimi innymi profilami związanymi z grą. –

+0

Nie marnowałbym czasu na struktury podczas programowania gry w języku OO. Problemem ** I ** będzie stawić czoła, zanim problemy z wydajnością ** nie kończą ** gry. Klasy i obiekty zwiększają szybkość IMO. – Bitterblue

Odpowiedz

4

Twój uczestnik otrzymuje typ referencji - List, więc mimo to podajesz całą listę jako odniesienie.

Przekazywanie dużej struktury według wartości jest zdecydowanie najdroższe, niż podanie tylko odniesienia. Kiedy masz dużą strukturę, zwykle nie ma sensu używać jej jako struktury, po prostu przekształć ją w klasę.

W każdym razie, czy jesteś z pewnością będziesz mieć tutaj problem z wydajnością? Wydaje się, że to bardzo przedwczesna optymalizacja.

+0

Programuję grę, a także uczę się pisać szybciej. Ten dokładny krok nie stanowi większego problemu, ponieważ co najwyżej nie będzie więcej niż 1000 żądań odnajdywania ścieżek na sekundę (zakładam). Ale w strukturze węzła pathfinders może to bardzo dobrze skalować do 100nodes * 1000pathFindingRequests, i poznanie tego prawdopodobnie pomoże tam. –

+0

Dereferencja 100 węzłów 1000 razy - czyli 100 000 dereferencji, druga nie powinna stwarzać żadnego problemu. – zmbq

+0

A jeśli okaże się, że jego gra jest opóźniona, profilowanie prawdopodobnie ujawniłoby jakąś pojedynczą linię kodu, która jest odpowiedzialna. Komputery w dzisiejszych czasach są bardzo szybkie. – fabspro

7

wiem, że klasa jest zawsze przekazywane przez referencję i że struct jest przekazywane przez wartość, ale mówimy o przejściu struct przez odniesienie tutaj.

Prawdopodobnie masz dobry pomysł, ale jest to niepoprawne. Wszystko w języku C# jest przekazywane wartością, chyba że używasz słowa kluczowego ref.

Instancje klasy są typami referencji, a przykłady struct są typami wartości.

Po przekazaniu referencji według wartości, przekazuje się kopię odniesienia (małą). Kiedy przekazujesz wartość typu według wartości, przekazujesz kopię wszystkich danych (potencjalnie dużych).

Jon Skeet ma dobre wytłumaczenie tego wszystkiego here.