2009-08-27 30 views
6

Nie oczekuję określonego tak lub nie. Każda wiedza, którą możesz mieć, uznaję za odpowiedź.Jeśli włączone są optymalizacje, JIT zawsze będzie wstawiać tę metodę?

private String CalculateCharge(Nullable<Decimal> bill, Nullable<Decimal> rate) 
{ 
    return ((bill ?? 0.0m) * (rate ?? 0.0m)).ToString("C"); 
} 
+0

Trudno powiedzieć "tak", ale ponieważ jest to prywatne, zakładam, że tak. –

+5

Kompilator języka C# nigdy nie wstawia * nic *. Aby uzyskać listę optymalizacji kompilator C# - a nie kompilator jit - wykonuje, zobacz mój artykuł na ten temat. http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx –

+0

Dzięki Eric, wygląda na to, że mam dużo do zrobienia. – ChaosPandion

Odpowiedz

21

Inline to szczegół implementacji JIT, a nie kompilatora C#. Od Eric Gunnerson's blog:

JIT wykorzystuje szereg heurystyk do zdecydować, czy dana metoda powinna być w wysadzanej. Poniższa lista WaŜniejszymi tych ( zauważyć, że nie jest wyczerpujący)

  • metod, które są większe niż 32 bajty IL nie być wstawiane.
  • Funkcje wirtualne nie są podkreślone.
  • Metody, które mają złożoną kontrolę przepływu, nie zostaną uwzględnione. Złożona kontrola przepływu to dowolna kontrola przepływu inna niż niż w przypadku/then/else; w tym przypadku przełącznik lub podczas.
  • Metody, które zawierają bloki obsługi wyjątków, nie są narysowane, ale metody, które wyrzucają wyjątki od , nadal są kandydatami do wstawiania .
  • Jeśli którykolwiek z formalnych argumentów metody jest sformatowany, metoda nie zostanie wstawiona w postaci .

Chociaż metoda jest dość krótki i niezbyt skomplikowane więc może dopasować heurystyki, Nullable<T> jest struct więc Przypuszczam metoda nie jest inlined.

Zgodnie z ogólną zasadą, jeśli oznaczenie tej metody poprawi wydajność, JIT wprowadzi tę metodę; inaczej nie będzie. Ale to jest naprawdę szczegółowo wdrożenie JIT i nic nie trzeba kodować:

bym starannie rozważyć wyraźnie kodowania dla tych heurystyk, ponieważ mogą one ulec zmianie w przyszłych wersjach JIT. Nie podważaj poprawności metody, aby spróbować zagwarantować, że zostanie ona wstawiona.

EDIT: Widocznie nieco o elemencie nie jest włączonych jest out-of-date; zaktualizowane informacje można znaleźć pod adresem Vance Morrison's blog.

+2

Opcja struct nie jest już prawdą z .NET 3.5sp1. Parametry struct można teraz wstawiać. –

+0

@Reed Copsey: Dzięki za informację. Punkt sprawdzony :) – dtb