2009-11-28 8 views
5

Was ist los mit Inlining Funktionen oder Prozeduren in Delphi (speziell v2010 hier, aber ich hatte das gleiche Problem mit Turbo Delphi)?Delphi 2010 inlining nutzlos?

Es gibt einige discalimer in der Hilfe über es möglicherweise nicht immer eine Funktion inline wegen "bestimmter Kriterien" was auch immer das bedeutet.

Aber ich habe festgestellt, dass im Allgemeinen inlining Funktionen (sogar sehr einfache, die 3 oder 4 Zeilen Code haben) verlangsamt Code eher als beschleunigt es.

Eine großartige Idee wäre eine Compiler-Option, um "alles inline" zu machen. Es ist mir egal, ob meine exe um 50% oder so wächst, um es schneller arbeiten zu lassen.

Gibt es eine Möglichkeit, dass ich Delphi zu wirklichem Inline-Code zwingen kann, auch wenn sich der Compiler nicht dafür entscheidet? Das würde wirklich helfen. Andernfalls müssen Sie "manuelles Inlining" durchführen, um den Prozedurcode in mehreren Bereichen Ihres Codes zu replizieren, zB "// Inlining ist hier fehlgeschlagen. Wenn Sie also die nächsten 5 Zeilen ändern, ändern Sie diese in den anderen 8 doppelten Punkten "

Irgendwelche Tipps hier?

Antwort

11

Es gibt eine Compileroption zum automatischen Inlining von kurzen Routinen. In den Projektoptionen, unter Delphi Compiler -> Kompilieren -> Codegenerierung, drehen Sie "Code Inlining Kontrolle" auf Auto. Beachten Sie jedoch, dass dies nur auf einem Release-Build erfolgen sollte, da inline-Code schwer zu debuggen ist.

Sie sagten auch, dass es Ihnen nichts ausmacht, Ihr Programm größer zu machen, solange es schneller wird, aber dass es oft inlining es langsamer macht. Sie sollten sich bewusst sein, dass dies möglicherweise zusammenhängt. Je größer Ihr kompilierter Code ist, desto mehr Instruktions-Cache-Fehler werden Sie haben, was die Ausführung verlangsamt.

Wenn Sie Ihr Programm wirklich beschleunigen möchten, führen Sie es durch einen Profiler. Ich empfehle Sampling Profiler, die frei ist, wird mit Delphi-Code (einschließlich 2010) arbeiten und verlangsamt nicht Ihre Ausführung. Es zeigt Ihnen einen detaillierten Bericht darüber, welchen Code Sie tatsächlich am meisten Zeit in Anspruch nehmen. Sobald Sie das gefunden haben, können Sie sich auf die Engpässe konzentrieren und versuchen, sie zu optimieren.

+1

Code Inlining-Steuerelement auf Auto eingestellt hat nicht geholfen. Sampling Profiler ist großartig. Sehr hilfreich, um zu zeigen, wo die Engpässe in echten Statistiken sind. Auch wenn es mir wirklich gezeigt hat was ich schon neu habe. Es wird sicher in Zukunft nützlich sein. Danke. – TallGuy

3

Inlining kann in manchen Fällen die Situation verlangsamen. Die Inline-Funktion kann die Anzahl der für lokale Variablen erforderlichen CPU-Register erhöhen. Wenn nicht genügend Register verfügbar sind, werden die Variablen stattdessen im Speicher abgelegt, was sie langsamer macht.

Wenn die Funktion nicht inline ist, stehen (fast) alle CPU-Register zur Verfügung.

Ich habe festgestellt, dass es in der Regel keine gute Idee zu Inline-Funktionen mit Schleifen ist. Sie werden einige Variablen verwenden, die wahrscheinlich im Speicher landen und den inline Code langsamer machen.

+2

Wenn Sie die Anzahl der Bytes erhöhen, die zum Ausführen eines bestimmten Algorithmus benötigt werden, wird auch der CPU-Cache mehr beansprucht. In seltenen Fällen könnte dies auch Auswirkungen haben. –

+3

Lars +1 - außer dass es nicht so selten ist. –

1

Wenn Sie force inlining zwingen möchten, dann verwenden Sie Include-Dateien. Sie müssen sicherstellen, dass Sie die richtigen Variablen deklarieren, und verwenden Sie dann {$ I Dateiname.inc}. Dadurch wird der spezifische Code immer dort eingefügt, wo Sie ihn haben möchten, und Sie können ihn leichter pflegen, wenn Sie ihn ändern müssen.

Denken Sie daran, dass der Compiler von Leuten geschrieben ist, die klüger sind als die meisten normalen Sterblichen (einschließlich mir selbst) und Zugang zu mehr Informationen hat, wenn sie sich für Inline entscheiden oder nicht, wenn sie nicht inline ist, hat sie wahrscheinlich einen guten Grund .

0

Wenn ich einen der FPC-Compiler-Entwickler (der das gleiche Problem hat) richtig verstanden habe, kann Inlining nur passieren, wenn die zu inline zu programmierende Routine bereits kompiliert wurde.

IOW Wenn Sie die Einheit mit den inline-to-be-Funktionen eine "Blatt" -Einheit machen und sie als erste in die uses-Klausel Ihres Projekts (.dpr) setzen, sollte es in Ordnung sein. Beachten Sie, dass mit "Blatt" -Einheit eine Einheit gemeint ist, die nicht auf andere Einheiten im Projekt angewiesen ist, sondern nur auf bereits kompilierte Einheiten.

Ich wäre nicht überrascht, dass es in Delphi dasselbe war, da es ein Einheitensystem teilt, das auf denselben Prinzipien basiert.

Es ist auch ziemlich unfixierbar ohne gegen separate Kompilierungsprinzipien zu verstoßen.