2009-03-15 14 views

Odpowiedz

25

Co to jest

W kategoriach C i C++ użyć słowa kluczowego inline aby poinformować kompilator zadzwonić rutynowych bez obciążania popychanie parametrów na stos. Funkcja zamiast tego ma swój kod maszynowy wstawiony do funkcji, w której został wywołany. Może to spowodować znaczny wzrost wydajności w niektórych scenariuszach.

Niebezpieczeństwa

Korzyści prędkości w użyciu „inline” spadek znacząco jak wielkość wzrasta funkcji inline. Overuse może spowodować spowolnienie działania programu. Podkreślenie bardzo małej funkcji akcesora zazwyczaj zmniejsza rozmiar kodu, a umieszczenie bardzo dużej funkcji może znacznie zwiększyć rozmiar kodu.

inline w C#

W języku C# inline dzieje na poziomie JIT, w którym kompilator JIT podejmuje decyzję. Obecnie nie ma mechanizmu w języku C#, który można wyraźnie to zrobić. Jeśli chcesz wiedzieć, co robi kompilator JIT, możesz zadzwonić: System.Reflection.MethodBase.GetCurrentMethod().Name w czasie wykonywania. Jeśli metoda zostanie wstawiona, zwróci nazwę osoby dzwoniącej.

W języku C# nie można wymusić na inline metody, ale można wymusić na niej metodę. Jeśli naprawdę potrzebujesz dostępu do konkretnego programu do obsługi połączeń i musisz usunąć inline, możesz użyć: MethodImplAttribute z MethodImplOptions.NoInlining. Dodatkowo, jeśli metoda zostanie zadeklarowana jako wirtualna, nie będzie również wstawiana przez JIT. Powodem tego jest to, że ostateczny cel połączenia jest nieznany.

More on inlining

+3

Aby być bardziej poprawne, don "t" powiedz kompilatorowi, "ty" zrób sugestię kompilatorowi, że może, ale nie musi, uważać. " –

1

Definicja i omówienie inliningu, see this question.

W języku C# nie trzeba poinstruować kompilatora ani czasu wykonywania, aby wstawić, ponieważ czas działania zrobi to automatycznie.

P.S. Ta odpowiedź jest również poprawna w przypadku języka Java.

1

inline jest, gdy zamiast wywoływania danej funkcji zawartość funkcji są wykonywane bezpośrednio w miejscu wywołania. Głównym powodem wykonania tej czynności jest usunięcie kosztów wywoływania funkcji przez uruchomienie zawartości funkcji w miejscu wywołania.

Jest używany jako technika optymalizacji. W przypadku C#, to faktycznie zależy od silnika CLR JIT do wykonania pracy. W środowisku uruchomieniowym podczas kompilowania metody silnik JIT będzie używał heurystyki do określenia, czy funkcja wbudowana jest odpowiednia i czy będzie optymalizacją efektywną. Jeśli tak, wykonywana jest inline.

Vance ma świetny artykuł na temat tego, co uważa JIT gdy inline: http://blogs.msdn.com/vancem/archive/2008/08/19/to-inline-or-not-to-inline-that-is-the-question.aspx

Nie ma sposobu, aby wymusić inline w C#. Język nie obsługuje tej konstrukcji. Głównie dlatego, że ludzie są bardzo kiepskimi sędziami, co należy zoptymalizować. JITer jest znacznie lepszym sędzią.