Komponenten dyn. erzeugen - Performance?



  • Hallo Leute

    ich hab für die Visualisierung einer Datenmenge eine Klasse von TPanel abgeleitet.
    Dieses neue Panel enthält noch zusätzlich ca. 20 Labels, ein Shape, eine ToolBar.
    Leider dauert die dynamische Erzeugung der neuen Panels relativ lange...
    ( ca. 9ms / Panel )

    Ich habe mal zum Vergleich ein Panel im Designer angelegt, ein paar Labels reingeworfen und gestartet. Das Panel hab ich dann 100 mal kopiert.
    Ergebnis ist, dass praktisch keine Zeit für die Erzeugung benötigt wird.

    Warum dauert die Erzeugung meiner abgeleiteten Panels deutlich länger, als der Aufbau der im Designer erzeugten Panels?

    Gibt es irgendeine Möglichkeit, die Erzeugung meiner eigenen Panels zu beschleunigen?



  • Du könntest einen Profiler benutzen, um herauszufinden, warum das so lange dauert. (Bei C++Builder XE ist AQtime Standard dabei.)

    Ansonsten wäre es hilfreich, wenn du ein Beispielprojekt zur Verfügung stellen könntest, damit man sich zum Testen deiner Situation nicht alles selbst rekonstruieren muß.



  • Du meinst also, es sollte prinzipiell nicht so lange dauern?
    Dann sollte ich also mal nach dem Performanceloch suchen..



  • Außerdem könntest du einfach versuchen, statt des Panels ein Frame zu verwenden. Frames kann man auch als Komponente registrieren, siehe hier.



  • Ich hab mal Zeiten im Konstruktor des Panels gemessen.

    /*
     * Konstruktor
     */
    __fastcall Cposition::Cposition( TWinControl *AOwner, int iIdx )
        : TPanel( AOwner )
    {
        Parent = AOwner;
        Width = 800; //AOwner->ClientWidth - 20;
        Height = 80;
        Left = 0;
        Top = iIdx * Height;
    
        this->OnClick = PanelClicked;
    
    }
    

    Ich hab mal die Erzeugung der Komponenten rausgenommen, denn die verbrauchen nur ca. 1/10 der Zeit. Ein Großteil der Zeit wird in o.g. Code verbraucht.

    Also Parent, Width, Height, Top, Left...

    Anmerkung: Der Owner und auch der Parent ist eine ScrollBox, die zum Erzeugungszeitpunkt invisible ist, damit die Paintevents eingespart werden.



  • Benutze besser die Methode SetBounds(...) anstatt die vier Werte von Hand zu setzen...
    (evtl sogar UpdateBoundsRect(...), wenn du gar keine Events erzeugen willst).



  • Danke dir 🙂
    Das UpdateBoundsRect hat den Zeitbedarf schonmal mehr als halbiert... 😃

    Schonmal ein guter Anfang.



  • Ein weiterer teurer Faktor ist scheinbar auch noch die Toolbar...

    Toolbar ist raus und ersetzt durch BitBtns ... Jetzt liegt es fast nur noch an den Labels und da ist nichts mehr machbar.

    Bei jedem TLabel geht 99% der Zeit für das eigentliche new und das Parent drauf und um die zwei komme ich wohl nicht herum.

    Ich danke euch für eure Hilfe. Ich bin jetzt in einem Performancebereich der ausreichend ist 😉



  • Du könntest auch zuerst die Bounds und dann den Parent setzen; vielleicht ändert das etwas (sofern es überhaupt geht).


Anmelden zum Antworten