kostenloser Webspace werbefrei: lima-city


Macht "inline" Sinn?

lima-cityForumProgrammiersprachenC/C++ und D

  1. Autor dieses Themas

    krisi12345

    Kostenloser Webspace von krisi12345

    krisi12345 hat kostenlosen Webspace.

    In c/c++ gibts ja die möglichkeit funktionen mit "inline" zu deklarieren. Dabei wird der Inhalt der Funktion vom Compiler direkt an die stelle wo sie ausgeführt wird "hinkopiert" und so durch muss die Funktion dann nicht angesprungen werden und das (soll) Zeit sparen. Ich verwende inline öfters bei Funktionen bei den nur einzelne Variablen verändert werden und es keine großen Berechnungen oder langen Code gibt.

    Nun habe ich jetzt ein paar mehr oder weniger representative "Tests" durchgeführt und festgestellt das der performance gewinn nur umheimlich gering ist (wenn es überhaupt einen gibt) und da frag ich mich doch ob inline daher überahaupt einen sinn macht.

    Den bei inline Funktionen die sehr oft verwendet werden (wobei ich schon sagte das ich das nur bei kurzen Funktionen mache) fällt das ja dann beim binär code ins gewicht (wobei das jetzt auch nicht das hauptproblem ist). Aber gibt vielleicht bestimmte Bereiche wo inline Sinn macht und wo man es verwenden sollte?
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. g****e

    Hey

    Also mir ist keine direkte Anwendung bekannt, wo du es brauchen könntest. Man könnte es höchstens auf sehr Leistungsschwachensystemen nutzen, wo genug Speicher vorhanden ist, um die Sprünge zu vermeiden, aber ich denke nicht, dass es so einen großen Unterschied macht. Bei modernen Systemen sparst du denk ich nichtmal 1ms, dann musst du die Funktion also 1000mal schnell hintereinander aufrufen, um eine Verzögerung von 1Sek zu erreichen. Da es aber nichtmal 1ms mehr dauert, sondern weniger, bringt es denk ich nicht viel.
    Übrigens: Zu viele inline dürften sich negativ auf die Performance auswerten.

    Meiner Meinung nach lohnt es sich nicht wirklich.

    Liebe Grüße
  4. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    ggamee schrieb:
    Bei modernen Systemen sparst du denk ich nichtmal 1ms, dann musst du die Funktion also 1000mal schnell hintereinander aufrufen, um eine Verzögerung von 1Sek zu erreichen. Da es aber nichtmal 1ms mehr dauert, sondern weniger, bringt es denk ich nicht viel.
    Weißt du eigentlich wie viel 1ms ist? Abhängig vom Einsatzgebiet kann das schon viel zu viel sein... aber das ist eben Anwendungsabhängig.

    Es gibt da außerdem noch das
    __inline
    bei dem der Compiler entscheiden muss, ob sich ein inline auszahlt oder nicht.
  5. hackyourlife spricht da wichtige Aspekte an. Ich möchte mir erlauben, das etwas näher zu erläutern:

    Einsatzgebiet: Wenn eine Funktion in einer Schleife aufgerufen wird, kann sich eine Sekunde Zeitgewinn schnell zu sehr viel Zeitgewinn steigern.

    Compiler entscheidet selber: Wenn du eine Funktion als inline deklarierst, ist das keine zwingende Anweisung an den Compiler diese Funktion tatsächtlich zu inlinen. Entsprechend kann es auch sein, dass bei deinen Testfällen überhaupt kein Inlining statt gefunden hat, da der Compiler deinen Inlining-Vorschlag nicht umsetzen wollte.

    Gewissheit bringt da eigentlich nur der Assembler-Dump. Dann sieht man, wie der Compiler sich entschieden hat.
  6. Hallo krisi12345,

    meine Erfahrung deckt sich mit Deinen Feststellungen. Man muss das inline-Schlüssewort wohl eher im historischen Kontext sehen:
    In den guten alten C-Zeiten war es noch so, dass Compiler den Quellcode relativ direkt, d.h. ohne aufwändige Optimierung, erzeugt haben. Das hat dazu geführt, dass viele kleine "Funktionen" als Präprozessor-Makros definiert wurden, da Funktionsaufrufe relativ teuer waren und der Code dadurch, bei richtigem Einsatz, schneller wurde.
    In C++ wurde diese Technik dann mit Hilfe des inline-Schlüsselwortes in die eigentliche Sprache integriert. Der Vorteil dabei war, dass inline-Funktionen im Gegensatz zu Makros typisiert sind, aufwändigeren Code in "gut lesbarer" Form enthalten können, Rückgabewerte besitzen und sich auch leichter Debuggen lassen.
    Mittlerweile wurde die Compiler-Optimierung wesentlich verbessert und auch das Link-Time-Code-Generation ist hinzugekommen. D.h. wenn man den Compiler den Code optimieren lässt und er feststellt, dass eine Funktion an einer Stelle als Inline schneller ist, dann baut er sie direkt ein (auch ohne inline-Schlüsselwort). Wenn der Compiler feststellt, dass ein direktes inlining den Code langsamer macht aber die Funktion in die nähe des Codes gebracht werden kann, s.d. sie per (Short) Jump erreichbar ist, dann wird das gemacht. Ansonsten wird die Funktion einfach als Funktion aufgerufen, wobei das mittlerweile auch eher per Jump als per Call gemacht wird.
    Wenn man dem Compiler zwingt, dass er inline-Funktionen auch als inline-Code einbauen soll oder man ihn zwingt, nicht inline-Funktionen als solche zu belassen, dann führt das im Allgemeinen zu einer schlechteren Performance.

  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!