Zwei Codes, einer ist schneller, wieso?



  • @SeppJ
    Code 1: Siehe Block 1 im OP
    Code 2: Siehe Block 2 im OP

    Die Codes sind von der Ausgabe gleich, beide haben genau 10 cout ausgaben pro Durchlauf beide haben genau 2 SetTextColorAttribute. Beide sind bis auf die if-switch Logik gleich.

    Ich verstehe nicht was an meiner Frage fehlen soll, beide Codes sind Äquivalent und beide Codes werden das gleiche in der Konsole anzeigen.

    Die Zeiten werden mir von meinem Compiler angezeigt nach Ausführung des Programmes, glaub es oder glaub es mir nicht, aber mein Compiler hat die Funktion.

    Da sagt man schon alles was man weiß und schreibt den ganzen Problemteil und ändert extra alles so dass nur die Kern Problematik erhalten bleibt, schreibt seine eigene Funktion um damit Leute sich nicht durch alles durchgraben müssen, testet beide unter gleichen Bedingungen und wird dann von einem Mod dumm angemacht weil etwas fehlen soll, obwohl der gesamt Code vorhanden ist.

    Wenn du keine Hilfe geben willst, dann lass es.



  • Nimm eine high_resolution_clock aus std::chrono und miss vernuenftig.

    // Edit: Ausserdem, welchen compiler benutzt du der angeblich sowas tut und mit welchen parametern compilst du?



  • @FP-C-Neuling: Du weißt aber schon, daß man deinen Code viel eleganter (d.h. kürzer) programmieren kann (ohne switch) - stattdessen mit 2 weiteren Schleifen?
    Dies spart unnötige Cache-Misses und sollte bei einem auf Geschwindigkeit optimierten Build auch schneller sein.

    Oder wolltest du nur testen, wie gut ein switch optimiert werden kann?

    PS: Außerdem ist case N ... M: kein Standard-C++, sondern eine compilerspezifische Erweiterung.



  • @Th69 Die "..." sind Platzhalter für Strings, wenn du das meintest die "..." werden die einzelnen Optionen sein die man auswählen kann, wenn du das nicht meintest. Nein weiß ich tatsächlich nicht, könntest du mir das erklären.

    und zum thema case N . . . M, wusste ich nicht dachte das wäre was aus C übernommenes 😅



  • @Cardiac Ich benutze DevC++ welcher dir nach jedem Ausführen des Programms die Runtime angibt, selbst ohne Return 0; befehl (oder exit();)

    //Edit: Was den Parameter angeht habe ich nie was geändert und ich hab auch keine Ahnung wo ich das nachgucken kann.



  • Die Ranges sind kein Standard, das ist eine GNU C Erweiterung, d.h. ich kann das nicht einfach via copy und paste ausprobieren. Einem online gnu compiler kann ich das auch nicht so einfach geben, weil der natürlich die windows.h nicht kennt. Dann sollte deine SetColor Funktion auch was zurück geben. Ist also doch was spezieller, bevor man den Code ans laufen bekommt. 😉

    Wenn du Geschwindigkeit testen willst, musst du das schon mehrfach ausführen und dann z.B. die Zeiten mitteln. Dabei sicher stellen, dass keine Prozesse im Hintergrund die Ausführung beeinflussen, soweit wie möglich.
    Insgesamt sind für Geschwindigkeitsbeurteilungen wichtig:

    • welcher Compiler
    • welche Compiler Flags
    • welches OS
    • welche Hardware


  • Nicht mitteln, sondern die kürzeste Laufzeit nehmen. Das wird dann die sein, wo du die wenigsten Störeffekte durch andere Prozesse hast.



  • @Schlangenmensch

    Ok das ist doch schonmal hilfreich.

    • DevC++;
    • (Wie mein Name schon vermuten lässt planlos, hab keine Ahnung)
    • Windows 10 (Redstone 1) 64bit
    • Ich Programmiere sowohl auf meinem Dell Latitnde 3380 Laptop, sowie auf meinem Desktop PC, könntest du mir sagen welche Specs du genau brauchst damit ich keinen Roman schreiben muss?


  • Ich meinte so etwas:

    const int MaxX = 10;
    for (int x = 0; x < MaxX; ++x)
    {
    	for (int y = 0; y < x; y++)
    		cout << "..."<< endl;
    	
    	SetColor(16);
    	cout << "..."<< endl;
    	SetColor(7);
    
    	for (int y = x + 1; y < MaxX; ++y)
    		cout << "..."<< endl;
    }
    

    (selbst wenn die "..." unterschiedliche Texte (je nach x) sind, dann können die mittels eines Arrays adressiert werden)

    PS: Und du mußt selbstverständlich einen Release-Build auf Performance testen (und am besten außerhalb deiner IDE).
    Trotzdem testest du damit nur (wie @SeppJ schon geschrieben hat) die Geschwindigkeit der Konsolenausgabe...



  • @DocShoe Ich hätte aber schon gerne Code der zuverlässig ist und selbst wenn ich die kürzeste Runtime nehme war nach 10 test von jedem Code immer noch Code 1 schneller, hatte jetzt nochmal getestet mit den gleichen Ergebnissen

    Schnellste Runtime
    Code 1: 0.14 sec
    Code 2: 0.18 sec



  • @Th69 Das ist super cool danke, wusste garnicht das man auch ohne {} unter eine For function schreiben kann. Wäre ich im Leben nicht drauf gekommen XD. Und ja die "..." werden unterschiedliche Texte sein.



  • @FP-C-Neuling sagte in Zwei Codes, einer ist schneller, wieso?:

    DevC++;

    Ok, DevC++ ist eine Entwicklungsumgebung (IDE), die offenbar MinGW als Compiler verwendet. Da ich DevC++ nicht da habe und noch nie gesehen habe, kann ich dir nicht sagen, wo du Compiler Einstellungen vornimmst.
    Google behauptet, es gibt sowas wie Project Settings -> Compiler mit einem "Parameters" Tab. Du willst wahrscheinlich mit -O2 oder -O3 optimieren.

    Mit Hardware ging es mir um Prozessor und Taktung, aber ich glaube das ist erstmal Zweitrangig. 10 Zeilen Ausgeben und Farbe von der Konsole ändern sollte so schnell gehen, dass du davon nix merkst.



  • Bei nur einer Anweisung (unterhalb einer Schleife) kann man die Blockklammern { und } weglassen, aber das ist ja nicht das entscheidende hier (du kannst sie auch wieder hinschreiben), sondern die Mathematik bezüglich der beiden zusätzlichen Schleifen.
    Du hast quasi selber ein "Loop-Unroll" durchgeführt (also was der Compiler selber vornimmt, wenn eine Schleife optimiert werden kann).



  • @Schlangenmensch Nun ja, DevC++ ist gratis, aber brauchst es ja nicht downloaden. Leider finde ich diesen Parameter-Tab nicht : /, hätte sonst gerne an der Stelle was gesagt



  • @FP-C-Neuling sagte in Zwei Codes, einer ist schneller, wieso?:

    Das ist super cool danke, wusste garnicht das man auch ohne {} unter eine For function schreiben kann.

    Nach einem for (oder auch ìf, else, while, ... weiter nicht aufgeführte Kontrollstrukturen) kannst du eine Anweisung schreiben.
    Du kannst jedoch mehrere Anweisung mittels {} zu einem Block zusammenfassen. Der geht als eine Anweisung durch.



  • @FP-C-Neuling sagte in Zwei Codes, einer ist schneller, wieso?:

    @Schlangenmensch
    Ok das ist doch schonmal hilfreich.

    DevC++;

    Ganz wichtig ist dabei auch die benutzte Version. Vom Compiler und der IDE.



  • @Th69 Hmmmm...ok. Übrigens alles war im Relesebuild 64Bit getestet wenn es um die Zeiten ging, nie ein Debug build



  • @DirkB Alles klar ^^



  • Nächste Frage: was hast du also gemessen? Wie lange die switches dauern? Oder eher: wie lange die couts brauchen? Oder ist es, wie lange das Programm braucht, bis es geladen ist? Wenn du die gesamte Laufzeit misst, misst du alles zusammen und kannst daraus nicht auf einzelne Programmabschnitte schließen. Gerade bei solchen Mini-Differenzen. Warum willst du hier überhaupt Geschwindigkeit messen? Wäre es nicht besser, erst einmal C++ richtig zu lernen?



  • @wob Ich habe getestet bis dieses Programm gelandet ist ja, ich habe es aus dem Hauptprogramm entnommen um damit zu testen. Es ging mir darum welcher von Beiden schneller ist und warum Code 1 schneller als Code 2 ist obwohl Code 1 mehr Switchfunktionen bei gleicher Ausgabemenge und Art hat. (10 couts und 2SetColorTextAttribute) und sie sich nur in der If-Switch Logik unterscheiden


Anmelden zum Antworten