Einfluß der Funktionsdeklaration, Parameterübergabe auf Geschwindigkeit



  • Hallo,

    ich habe da mal eine Frage bezüglich der Ausführungsgeschwindigkeit von Funktionen abhängig von der Deklaration und/oder der Parameterübergabe.

    In meinem Programm habe ich mich zur Darstellung von Daten von dem bisher verwendeten StringGrid abgewandt und mir ein Eigenkonstrukt aus einer
    ScrollBox mit einem darin befindlichen GridPanel gebaut. Dieses GridPanel wird zur Laufzeit mit den entsprechenden Zeilen und Spalten gefüllt, und in
    diese einzelnen Zellen dann entsprechend der benötigten Darstellung dann ebenfalls wieder dynamisch zur Laufzeit weitere GridPanels mit Labels oder einfach nur Labels eingefügt. Das funktioniert auch sehr gut. Dazu habe ich mir eine Funktion geschrieben welche als Parameter die Zeile, die Spalte und einen TStringList-Pointer mit den zu schreibenden Daten bekommt.

    void TForm1::InsertWeekplanCellData(int iColumn, int iRow, TStringList *pCellData)
    

    Diese Funktion wird sehr oft benötigt und auch zum 'Burstfüllen' des ganzen Panels benutzt. Dazu nun meine Frage. Macht es Sinn die beiden
    Integer-Parameter als Referenzen zu übergeben,

    void TForm1::InsertWeekplanCellData(int &iColumn, &int iRow, TStringList *pCellData)
    

    oder das ganze evtl. als Fastcall-Funktion mit oder ohne Referenzen?

    void __fastcall TForm1::InsertWeekplanCellData(int iColumn, int iRow, TStringList *pCellData)
    ...
    void __fastcall TForm1::InsertWeekplanCellData(int &iColumn, int &iRow, TStringList *pCellData)
    

    Oder optimiert der Compiler das schon von sich aus?

    Vielen Dank, Grüße Netzschleicher



  • __fastcall versucht die Funktion in Register zu packen um schnellern Zugriff auf sie zu erhalten, bzw. schneller auszuführen. Ist die Funktion allerdings für die Register zu groß wird sie herkömmlich abgehandelt. Gerade bei Funktionen die sehr oft genutzt werden würde ich die __fastcall Methodik vorziehen.

    Edit: M.e. macht die Übergabe per Referenz durchaus Sinn da nur die Speicheradresse übergeben wird anstatt die ganzen Integer hin und her zu kopieren.



  • Habe gerade nochmal etwas nachgelesen. Die Referenzierte fastcall Methode ist definitiv die schnellste



  • Aber Grunddatentypen als Referenzen zu übergeben ist Blödsinn (und selbst wenn dann müßte man 'const int&' verwenden).
    Aber die Parameterübergabe wird wohl den geringsten Performance-Anteil an der Methode ausmachen...



  • @Zero01
    Danke, so hatte ich es auch gedacht. War mir jedoch nicht sicher.

    @Th69
    Nun ja, ob beim Funktionsaufruf nun die Integervariable direkt mit ihren 4Byte auf den Stack kopiert wird, oder ein Pointer darauf, der ja auch 4Byte groß ist, dürfte bei dieser Funktion wirklich keine Rolle spielen. Ich denke aber das der '__fastcall' Zusatz doch noch etwas flotter ist. Korrigier mich bitte wenn ich falsch liege. Und das ich die Funktion an sich in der nächsten Zeit noch versuchen werde zu verbessern ist für mich auch klar.



  • Netzschleicher schrieb:

    Nun ja, ob beim Funktionsaufruf nun die Integervariable direkt mit ihren 4Byte auf den Stack kopiert wird, oder ein Pointer darauf, der ja auch 4Byte groß ist, dürfte bei dieser Funktion wirklich keine Rolle spielen.

    Aber indirekte Zugriffe (dh über Pointer/Referenzen) sind langsamer als direkte Zugriffe, da ja immer zwei Zugriffe stattfinden müssen: Erstmal auf den Pointer, dann auf die darin enthaltene Adresse. Von Aliasing ganz zu schweigen.

    Ich denke aber das der '__fastcall' Zusatz doch noch etwas flotter ist.

    Die Frage ist, ob das bei dieser Funktion etwas bringt. Die tut ja auch wirklich was, nämlich irgendwelche Strings in ein GUI-Widget eintragen. Dagegen fällt der Overhead der Parameterübergabe absolut nicht ins Gewicht.



  • Bashar schrieb:

    Aber indirekte Zugriffe (dh über Pointer/Referenzen) sind langsamer als direkte Zugriffe, da ja immer zwei Zugriffe stattfinden müssen.
    Erstmal auf den Pointer, dann auf die darin enthaltene Adresse. Von Aliasing ganz zu schweigen.

    Ok, von dieser Perspektive hab ich das überhaupt noch nicht betrachtet. Dann würdest Du also in diesem Fall wirklich nur die beiden Integer-Variablen direkt als Parameter angeben, ohne Pointer/Referenzen.

    Die Frage ist, ob das bei dieser Funktion etwas bringt. Die tut ja auch wirklich was, nämlich irgendwelche Strings in ein GUI-Widget eintragen. Dagegen fällt der Overhead der Parameterübergabe absolut nicht ins Gewicht.

    Ich werd den '__fastcall' auf jeden Fall einmal belassen. Negative Auswirkungen konnte ich bis jetzt nicht feststellen.



  • Oh, so habe ich es auch nicht gesehen. Danke für die Erklärung


Log in to reply