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.
+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
@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. –
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. –