Autor Wątek: inline w C#  (Przeczytany 4318 razy)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 30, 2007, 20:45:30
Czy istnieje coś takiego jak "inline" w C#? Przeleciałem całą książkę i nie znalazłem. Widzę tylko zdanie mówiące o tym, że kompilator JIT stosuje "inlining" ale programista nie decyduje gdzie kompilator ma to zastosować.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

RageX

  • Gość
# Sierpień 30, 2007, 21:02:34
No to poczytaj dalej... np. "default"owe konstruktory są inline'owane, pętle for w swojej standardowej konstrukcji... itd. :)
Szukajcie, a znajdziecie.

Edit: A tu najlepsze źródło wiedzy na ten temat(wszystko co zwiazane z wydajnością na .net) momentami hardcock. Czytałem tego trochę, ale w międzyczasie mi się odwidziało.
http://blogs.msdn.com/ricom/

Edit2: He, ten kolo został teraz chief architect od visual studio. Właśnie doczytałem. :D
« Ostatnia zmiana: Sierpień 30, 2007, 22:41:14 wysłana przez RageX »

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 30, 2007, 21:38:10
No to poczytaj dalej... np. "default"owe konstruktory są inline'owane, pętle for w swojej standardowej konstrukcji... itd. :)

Czyli ja nie mogę sobie napisać maleńkiej funkcyjki i kazać kompilatorowi potraktować ją jako inline? Kompilator decyduje co ma być inline, a co nie może być. Dobrze wiedzieć - będę musiał pewien wzorek wklepać ręcznie w kilku miejscach skoro nie mam gwarancji, że funkcja będzie inline.



Szukajcie, a znajdziecie.

No właśnie tak szukam, szukam i widzę, że inline niby jest ale programista o tym nie decyduje. :)



Edit: A tu najlepsze źródło wiedzy na ten temat(wszystko co zwiazane z wydajnością na .net) momentami hardcock. Czytałem tego trochę, ale w międzyczasie mi się odwidziało.
http://blogs.msdn.com/ricom/

Zerknę tam ale skoro Tobie się odwidziało to ja pewnie dłużej nie wytrzymam i też mi się odwidzi. :)

Offline spax

  • Użytkownik

# Sierpień 30, 2007, 21:54:25
No to poczytaj dalej... np. "default"owe konstruktory są inline'owane, pętle for w swojej standardowej konstrukcji... itd. :)

Czyli ja nie mogę sobie napisać maleńkiej funkcyjki i kazać kompilatorowi potraktować ją jako inline? Kompilator decyduje co ma być inline, a co nie może być. Dobrze wiedzieć - będę musiał pewien wzorek wklepać ręcznie w kilku miejscach skoro nie mam gwarancji, że funkcja będzie inline.


W C++ też nie masz takiej gwarancji.

pozdrawiam.

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 30, 2007, 22:11:43
W C++ też nie masz takiej gwarancji.

Aaaa to o tym też nie wiedziałem. Dzięki za informację. Ciekawe czy tak samo jest w czystym nieobiektowym ANSI C.

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Sierpień 30, 2007, 22:20:44
Cytuj
Aaaa to o tym też nie wiedziałem. Dzięki za informację. Ciekawe czy tak samo jest w czystym nieobiektowym ANSI C.
Prawie na pewno tak - bo inline w C wprowadzono już po wprowadzeniu go w C++ (chyba według C99, ale nie jestem pewien) - wręcz go zaadaptowano do tego języka.

Offline Anusia2007

  • Użytkownik

# Sierpień 30, 2007, 22:23:07
W C++ też nie masz takiej gwarancji.

Aaaa to o tym też nie wiedziałem. Dzięki za informację. Ciekawe czy tak samo jest w czystym nieobiektowym ANSI C.
Zastanow sie co by sie stalo jakby kompilator potraktowal funkcje rekurencyjna jako inline to bedziesz mial odpowiedz.

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 30, 2007, 22:35:00
Zastanow sie co by sie stalo jakby kompilator potraktowal funkcje rekurencyjna jako inline to bedziesz mial odpowiedz.

No ładnie by się pokiełbasiło. :) No ale jeżeli ta funkcja sama siebie nie wywołuje, a postawię przed nią "inline" to nie rozumiem dlaczego kompilator nie miałby jej wcisnąć w każde miejsce gdzie jest wywoływana. Ta funkcja byłaby oczywiście niewielka.

No ale kij w oko inline. ;) Po prostu chciałem wiedzieć jak jest w C#. Dzięki wszystkim za uświadomienie, że nawet w C/C++ dodanie "inline" wcale nie gwarantuje, że zostanie ono użyte.

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Sierpień 30, 2007, 22:36:41
Cytuj
No ale jeżeli ta funkcja sama siebie nie wywołuje, a postawię przed nią "inline" to nie rozumiem dlaczego kompilator nie miałby jej wcisnąć w każde miejsce gdzie jest wywoływana.
Dlatego, że on uważa, że jednak jest skomplikowana ;)

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Sierpień 30, 2007, 22:43:04
Czyli ja nie mogę sobie napisać maleńkiej funkcyjki i kazać kompilatorowi potraktować ją jako inline? Kompilator decyduje co ma być inline, a co nie może być.

Zauważ, że w 95% przypadków kompilator potrafi sprawniej i pewniej obliczyć, czy bardziej efektywna będzie funkcja, czy jej rozwinięcie. Prawdopodobnie więc martwisz się na zapas. Pozwól kompilatorowi odwalić jego robotę, a potem porównaj uzyskaną wydajność z programem z "wymuszonymi" przez ciebie funkcjami inline i dopiero wtedy narzekaj na to, że kompilator wszystko robi sam ;).

Offline Xion

  • Moderator
    • xion.log

# Sierpień 30, 2007, 23:02:38
Cytuj
Czyli ja nie mogę sobie napisać maleńkiej funkcyjki i kazać kompilatorowi potraktować ją jako inline? Kompilator decyduje co ma być inline, a co nie może być.
Samo inline w C++ nie daje ci gwarancji, że opatrzona nim funkcja faktycznie będzie rozwinięta. Jak słusznie zauważył Złośliwiec, zdecyduje o tym kompilator robiąc analizę strat i zysków i traktują to 'inline' jako wskazówkę.
Niektóre kompilatory umożliwiają jednak wymuszenie rozwijania bez względu na potencjalną efektywność. W VS robi się to na przykład przez __forceinline.

Offline _MtZ_

  • Użytkownik

# Sierpień 30, 2007, 23:27:54
W c++ inline jest wskazówką(nie poleceniem!) dla kompilatora aby każde wywołanie funkcji starał się zastąpić instrukcjami, które definiują funkcję.

Kompilator zignoruje tę wskazówkę gdy funkcja:
- zawiera zbyt dużo instrukcji (wspominał o tym złośliwiec)
- jest rekurencyjna
- jest wywoływana przed jej definicją
- jest wywoływana 2 lub więcej razy w tym samym wyrażeniu
- zawiera pętlę, instrukcję switch lub goto
- jest wywoływana przez wskaźnik

Źródło: Wiesław Porębski "Programowanie w języku c++" 1994(trochę stare ale chyba nie straciło na aktualności)

//Edit: Przepisywałem to ręcznie więc mogą być literówki :)

Offline mINA87

  • Użytkownik

# Sierpień 30, 2007, 23:37:54
Niektóre kompilatory umożliwiają jednak wymuszenie rozwijania bez względu na potencjalną efektywność. W VS robi się to na przykład przez __forceinline.

Dokładnie!! Ostatnio miałem problem, bo sobie zrobiłem na szablonikach metaprogramowanie używając dodatkowo SIMDów i chciałem by rekurencyjnie wygenerowany przez kompilator kod miał postać serii pojedynczych instrukcji SSE. Mimo inline'a było mase calli i związanych z nimi pierdół - masakryczny bałagan jedynm słowem, jednak po dodaniu __forceinline kompilator wygenerował mi piękny kodzik :)

Offline MDW

  • Użytkownik
    • www.encore-games.com

# Sierpień 31, 2007, 01:06:23
W c++ inline jest wskazówką(nie poleceniem!) dla kompilatora aby każde wywołanie funkcji starał się zastąpić instrukcjami, które definiują funkcję.

Kompilator zignoruje tę wskazówkę gdy funkcja:
- zawiera zbyt dużo instrukcji (wspominał o tym złośliwiec)
- jest rekurencyjna
- jest wywoływana przed jej definicją
- jest wywoływana 2 lub więcej razy w tym samym wyrażeniu
- zawiera pętlę, instrukcję switch lub goto
- jest wywoływana przez wskaźnik

Źródło: Wiesław Porębski "Programowanie w języku c++" 1994(trochę stare ale chyba nie straciło na aktualności)

//Edit: Przepisywałem to ręcznie więc mogą być literówki :)

Dzięki wielkie za tak dokładny opis. Teraz już całkiem się wszystko rozjaśniło. Co prawda chciałem się dowiedzieć jak to jest z inline w C# ale i wiedza z zakresu C/C++ mi się przyda. Dzięki!

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Sierpień 31, 2007, 12:15:51
Cytuj
W VS robi się to na przykład przez __forceinline.
Jedyny problem z tym, to fakt, że nie jest to przenaszalne rozwiązanie.