Funkcje inline - wielkość a wydajność

Funkcje inline - wielkość a wydajność
KS
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:41
0

Hey, mam następującą zagwozdkę:
Dlaczego funkcje inline powinny być krótkie, jaki wpływ na wydajność mają długie funkcje inline oraz dlaczego ma to w ogóle wpływ na wydajność? W końcu funkcja inline zamienia kod funkcji na kod zwykły kod. Zastanawiam się więc dlaczego funkcja, która nie jest inline miałaby się wykonać szybciej niż ta sama część kodu wewnątrz innej funkcji bardziej rozbudowanej?
Z góry dzięki za wyjaśnienie.

Patryk27
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:prawie 2 lata
  • Lokalizacja:Wrocław
  • Postów:13042
4

Ponieważ może nie starczyć rejestrów i będziesz ostatecznie miał jedną, dużą funkcję zajmując pełno rejestrów oraz miejsca na stosie.


PR
I warto dodać że kompilator może olać próbę inlinowania funkcji.
L0
"jedną, dużą funkcję zajmując pełno rejestrów oraz miejsca na stosie" chodzi ci o to, że będzie bardzo dużo zmiennych lokalnych i o to, że może być problem z rejestrami przy zagnieżdżonych pętlach? kompilator nie potrafi tego optymalizować? przecież w najgorszym przypadku będzie mógł zrobić to samo co robi ze zwykłymi funkcjami.
Patryk27
No tak, zrobi to samo co ze zwykłymi funkcjami i nie wykona inline'owania ;)
L0
czyli, poza niektórymi przypadkami, można używać inlinów wszędzie gdzie się da? (mówię o języku, bez wnikania co tam potem będzie z tym działo)
Patryk27
Ale po co? Kompilator i tak wie lepiej, nie próbuj być sprytniejszy :P
L0
myślałem, że gdy funkcja jest inline, to kompilator potrafi być jeszcze sprytniejszy :)
Patryk27
Nah, wszelkie inline, registry czy wstawki assemblerowe nie sprzyjają optymalizacjom.
spartanPAGE
@Patryk27 inline to tylko drobna sugestia dla kompilatora ;) Chociażby przy słodziutkich metodach(tak je nazwę, o!) które sprowadzają się do tego, o czym wspomniał @Shalom jest to idealne.
Patryk27
Żyjemy w XXI wieku, jak zechce to sam zinlinuje i bez podpowiedzi. Nawet FPC tak robi (bodajże dla niego "prosta" funkcja to taka składająca się max z jednego warunku, kiedyś zaglądałem do źródeł), a co dopiero te wszystkie wyrafinowane GCCki czy inne ;]
Endrju
Od zawsze zapominacie, że inline ma też inne znaczenie niż tyllko wstawianie kodu w miejsce wywołania. http://4programmers.net/Forum/C_i_C++/253524-funkcje_inline_w_c?p=1148607#id1148607
Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
4

Jest też kwestia względnego wzrostu wydajności. inliniowanie funkcji sprawia że oszczędzasz na:

  • zapisaniu na stosie adresu powrotu
  • skoku do funkcji
  • powrocie z funkcji
    Teraz jeśli twoja funkcja to jest jedna instrukcja to widać że wykonasz 1 instrukcje zamiast 4, czyli zysk dość spory. Ale jeśli twoja funkcja to jest 996 instrukcji to oszczędasz raptem 0.4% czyli raczej niewiele.

"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
KS
  • Rejestracja:około 10 lat
  • Ostatnio:ponad 8 lat
  • Postów:41
0

Ok, dzięki za wyjaśnienie.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.