Laufzeitprobleme mit eigener Liste



  • Hi,
    ich habe folgendes Problem: Ich habe eine doppelt verlinkte Liste geschrieben, deren Laufzeit vorallem beim Leeren der Liste (meiner Einschätzung nach) recht hoch ist. In meinem Fall hat die Liste ca. 6000 Elemente und um die Liste zu leeren benötigt sie ca. 250 Ms (zum Vergleich: zum Füllen lediglich ca. 50 Ms).
    Die Zeiten, die ich gemessen habe waren allerdings sehr komisch, denn es fehlt ca. 225 Ms, die der Operator delete braucht.

    Die Messwerte wurden vor und nach dem delete des Knotens gemacht und einmal am Anfang und am Ende des Destruktors des Knoten.

    Hier die Aufräum-Funktion der Liste:

    template <class T>
    void Liste<T>::clear() {
    	abTime time;
    	float timeNeeded = 0;
    	std::cout << "Laenge der Liste: " << lengthV << std::endl;
    	arbeitsKnoten = anfang;
    	while (anfang != nullptr) {
    		anfang = anfang->nach;
    		time.restartTime();
    		delete arbeitsKnoten;
    		timeNeeded += time.getTimeMSec();
    		arbeitsKnoten = anfang;
    		lengthV--;
    	}
    	Knoten<T>::info();
    	std::cout << "Zeit fuer 'delete' des Knotens benoetigt: " << timeNeeded << std::endl;
    }
    

    Der Destruktor des Knotens und die Infofunktion des Knoten:

    ~Knoten<T>() {
    	timer.restartTime();
    	if (inhalt != nullptr) {
    		delete inhalt;
    	}
    	timeNeeded += timer.getTimeMSec();
    }
    
    // [...]
    
    template <class T> void Knoten<T>::info() {
    	std::cout << "Zeit im Destruktor des Strings benoetigt: " << timeNeeded << std::endl;
    	timeNeeded = 0;
    }
    

    Und der Ort wo die .clear()-Funktion aufgerufen wurde:

    abTime time;
    time.start();
    liste.clear(true);
    std::cout << "Zeit fuer Leeren der Liste: " << time.getTimeMSec() << std::endl;
    

    Und hier die Ausgabe:

    Laenge der Liste: 5909
    Zeit im Destruktor des Knotens verbracht: 7.08278
    Zeit fuer 'delete' des Knotens benoetigt: 232.029
    Zeit fuer Leeren der Liste: 239.067
    

    Hat jemand evtl. eine Idee wo die Zeit geblieben ist bzw. ob ich irgendwo einen Fehler gemacht habe? 😕 Für jede Hilfe wäre ich sehr dankbar 🙂
    Mfg
    DujiBuji



  • Hi,

    1. Du bist im falschen Forum, hier ist C++/CLI, eine .NET Sprache. Besser wäre C++ - vermutlich wird dein Beitrag verschoben.
    2. new / new[] und delete / delete[] sind teure Operationen, d.h. es kann auch sein, dass es einfach so lahm ist, wie es ist.
    3. Hast du mit einem Release-Build gemessen? Im Debug-Build wird z.B. ein Debug-Heap benutzt um Speicherprobleme zu erkennen - das schlägt sich allerdings ins der Performance nieder.

    Gruss X



  • Hey,
    danke erstmal für die schnelle Antwort 🙂
    1. Jo, das stimmt wohl ^^ wäre nett wenn das irgendwer verschieben könnte 🙂
    2. Das kann auch sein, was mich aber verwundert hat, wieso das delete in dem Knoten so viel schneller ist, obwohl es genau so häufig aufgerufen wurde (in der Liste wurden übrigens std::string's gespeichert). So groß sollte der Unterschied doch nicht sein, oder?
    3. Ich habs gerade mal im Release Modus versucht und die unteren beiden zeiten blieben in etwa gleich, nur die obere Zeit ist statt 7 Ms nun nur noch 1,4 Ms 😕 Das macht die ganze Sache noch ein bisschen verwirrender finde ich, denn das bedeutet ja, dass noch mehr Zeit im delete-operator "verloren" geht 🙄

    Hier nochmal die Ausgabe im Release-Modus:

    Laenge der Liste: 5909
    Zeit im Destruktor des Knotens verbracht: 1.39927
    Zeit fuer 'delete' des Knotens benoetigt: 233.401
    Zeit fuer Leeren der Liste: 239.762
    


  • Auf der Konsole herumzuschreiben ist viel langsamer als dynamische Speicherverwaltung.



  • Deshalb mache ich es ja auch nur viermal, viel Zeit sollte das auch nicht brauchen.


Anmelden zum Antworten