Compiler "optimiert" merkwürdig`?



  • Hallo,

    mein Programm verhält sich Recht merkwürdig, ich hab das Gefühl das das Visual Studio 6.0 "schlecht" compiliert.
    Hier der Aufbau:

    void Funktion()
    {
    	for(int i=0; i<dynamischerwert; ++i)
    	{
     	 rufe methoden auf;
     	 zeige an wo du bist indem i ausgegeben wird;
    	}
    }
    

    Ich weiß also immer genau wo das Programm gerade steckt.
    Jetzt braucht es in genau dieser Konstellation immer 2 Minuten und 44
    Sekunden an Rechenzeit.

    Jetzt änder ich die Funktion ab:

    void Funktion()
    {
    	for(int i=0; i<dynamischerwert; ++i)
    	{
      	rufe methoden auf;
      	zeige an wo du bist indem i ausgegeben wird;
    	}
    
       Funktion2();
       Funktion3();
    }
    

    Funktion2 und 3 führen am Ende nur noch 2 Gesamtberechnungen durch.

    Mit den Funktionen braucht das Programm mit mal 3 Minuten und 55
    Sekunden an Rechenzeit. Wäre ja in Ordnung, aber mit mal braucht
    er für die Berechnungen innerhalb der Forschleife viel länger, Funktion2 und Funktion3 brauchen am Ende nicht mal 1 Sekunde.

    Das sieht mir so aus als ob er Funktion2 und 3 aufgebrochen hat und sie schon innerhalb der forschleife einsetzt, was zwar
    auch funktioniert aber ich finde das mehr als merkwürdig. Anders kann ich mir das einfach nicht erklären 😕



  • Hallo,

    Ich könnte mir vorstellen, dass in Funktion2 oder 3 eine Variable verwendet wird, die vorher in der Schleife geändert wird. Bei der ersten Version kann er die Variable einfach wegoptimieren, da das Ergebnis nie benutzt wird.

    DJohn



  • Schwer, dazu was zu sagen, wenn du alles postest, außer die Funktionen, die so lang brauchen... 😉



  • Quellcode zeigen darf ich leider nicht, aber ich bemühe mich zu erklären was dort passiert:

    Aus einer Datei werden Teilnehmer extrahiert. Die forschleife durchläuft für jeden Teilnehmer bestimmte Funktionen.
    Die Teilnehmer sind Klassen und speichern einige Werte (z.B. Gesamtlaufzeit von Nachrichten).

    Am Ende wird in den Funktionen 2 und 3 aus diesen Werten etwas errechnet.

    Funktion2 / Funktion3 nutzt keine globalen Variablen oder sonstiges, sie gehen einfach wieder per forschleife alle Teilnehmer durch und addieren z.B. die Gesamtlaufzeit.



  • Hmm, eventuell kann der Compiler dabei die Schleifen, die ja alle die gesamten Teilnehmer durchlaufen, sofern keine Abhängigkeiten vorhanden sind, zu einer zusammenfassen.


Log in to reply