Zwei Codes, einer ist schneller, wieso?



  • @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



  • @FP-C-Neuling
    Welchen Code misst du, den "vereinfachten" den du hier gepostet hast oder den "echten"?
    Weil: die beiden "vereinfachten" Varianten geben schonmal nicht das selbe aus. Die erste Variante gibt viel öfter "... end" aus als die zweite.
    Es wird also mehr in die Konsole geschrieben. Daher müsste mMn. eher die erste Variante langsamer sein.

    Ich vermute aber mal dass du den "echten" Code misst, und dass im "echten" Code andere Unterschiede existieren, die dann dazu führen dass dort die erste Variante schneller ist.



  • @hustbaer hast du recht, weiß nicht warum da der Fehler unterlaufen ist, in meiner Konsole stand das gleiche bei beiden Programmen, keine Ahnung ob ichs beim Schreiben des Posts noch nicht hatte und dabei den Code geändert hatte, XD. Aber ich habs jetzt im OP überarbeitet


Anmelden zum Antworten