2009-10-15 15 views
9

Kiedy, jeśli w ogóle, szybsze jest przekazywanie argumentów jako argumentów do metody statycznej, niż gdy metoda ma być niestatyczna i uzyskiwać dostęp do tych samych wartości za pośrednictwem elementów instancji. Załóżmy, że metoda uzyskuje dostęp do tych członków w trybie tylko do odczytu.Czy wykonanie metody statycznej może poprawić wydajność iw jakich okolicznościach?

Wszystkie inne rzeczy są równe, wywołanie metody statycznej to slightly faster niż wywoływanie metody instancji.

Wszystkie inne rzeczy są równe, wywołanie metody bez argumentów jest nieco szybsze niż wywołanie jednego z argumentami.

Rozważmy:

private Thing _thing; 

void DoTheThing() 
{ 
    _thing.DoIt(); 
} 

Versus to odpowiednik kodu:

private Thing _thing; 

// caller's responsibility to pass "_thing" 
static void DoTheThing(Thing thing) 
{ 
    thing.DoIt(); 
} 

Nie mogę myśleć o sytuacji w świecie rzeczywistym, gdzie ten rodzaj optymalizacji naprawdę dodać dowolną wartość, ale jako przemyślany eksperyment (dla tych, którzy lubią dyskutować o takich rzeczach), czy rzeczywiście istnieje korzyść, a jeśli tak, to ile argumentów (jakie typy itp.) przechyla równowagę w drugą stronę?

Czy inne czynniki będą miały na to wpływ? Metoda statyczna uzyskuje na przykład _thing jako zmienną lokalną, a nie pole.

+2

+1 Dobre pytanie. Po uruchomieniu analizy kodu na kodzie w usłudze VS pojawia się błąd CA1822, jeśli metody w klasie można oznaczyć jako statyczne. Zawsze mnie irytuje i naprawdę zastanawiam się, czy jest jakaś korzyść. – BFree

+0

@BFree - jeśli podążysz za linkiem podanym w pytaniu, zobaczysz, że wywołanie metody statycznej jest jeszcze trochę szybsze. W IL, osoba wywołująca nie musi przesyłać referencji do celu na stos (JIT prawdopodobnie to anuluje), a EE nie musi sprawdzać tego celu, aby uzyskać zerowy wynik. –

+2

Tak, jest pewien wzrost wydajności, ale prawdopodobnie nie zobaczysz go, dopóki nie wywołasz tej metody w pętli setki tysięcy razy. Przedwczesna optymalizacja. –

Odpowiedz

6

Jest jedna możliwe korzyści wydajność mogę thnk od (dla metody non-wirtualnym): metoda statyczna nie trzeba przetestować odwołanie o stwierdzenie nieważności pierwszej (rzucać NullReferenceException gdzie właściwe).

Ja nie myślę, że to daje jakąkolwiek przewagę, ale jest to możliwe. Nie jestem pewien, czy zastosowałoby się to w twoim konkretnym przykładzie - i ciężko jest zobaczyć, w jaki sposób miałoby to zastosowanie w każdym przypadku, w którym rzeczywiście chciałbyś, aby używał wartości.

0

W twoim przypadku (zakładam, że próbka kodu byłaby w klasie Thing) statyczne i niestatyczne nie będą miały żadnej różnicy prędkości. To z linku:

  • 0,2 0,2 ​​inlined statycznego połączenia
  • 0,2 0,2 ​​inlined to wezwanie inst

Więc nie ma sensu w ogóle, zarówno statyczne na zwiększenie prędkości.

Należy również wziąć pod uwagę, że wartości podane na połączonej stronie pochodzą z .Net 1.1 i są nieaktualne.

+0

Interesujący punkt, chociaż ma zastosowanie tylko wtedy, gdy metody są inline. Przykład użyty zostałby prawdopodobnie inline, ale większe metody (lub te z typami wartości jako argumentami, IIRC) nie zostałyby wstawione, w takim przypadku koszt połączenia statycznego 6.1ns i wywołanie instancji kosztowały 6,8ns. –

+0

Zgodnie z linkiem wywołanie instancji wynosi 6,2ns zamiast 6,1ns dla statycznego. Również nie ma liczb, które w rzeczywistości zakładam, że zostanie to nadmiernie skompensowane dodatkowym parametrem, co oznacza, że ​​wersja statyczna jest prawdopodobnie nawet nieco wolniejsza. – Foxfire

+0

Aby wyjaśnić: Jest to wywołanie tej instancji – Foxfire

0

Nie jestem pewien co do statyki wydajności wśród metod statycznych i metod instancji.

Uważam jednak, że decyzję należy podjąć niezależnie od tego, czy jest to metoda statyczna, czy metoda instancji na podstawie projektu obiektu. Jeśli wywołując metodę, stan obiektu nie zostanie zmieniony, to powinieneś uczynić tę metodę statyczną (metoda typu, a nie instancja pertikularna typu).

Powiązane problemy