Speedfrage :)



  • Hi,

    was ist eigentlich schneller von den beiden hier:

    int main (void)
    {
    here:
    
          goto here;
    
          return (false);
    }
    

    oder das:

    int main (void)
    {
          while(true)
          {
          }
          return (false);
    }
    

    welche schleife ist schneller? 😕



  • Hi,

    goto sollte schneller sein, da es eine normale jmp-Anweisung ist und nichts
    geprueft wird.

    IMHO merkt man das aber sowieso nicht.

    mfg
    v R



  • Jetzt wirds philosophisch. Ist unendlich gleich unendlich?



  • Jetzt wirds philosophisch. Ist unendlich gleich unendlich?

    Mein Name ist v R! Ich bin ein Prototyp T100 und bin Menschen ueberlegen.
    Ich sehe jeden Taktunterschied mit meinen weiterentwickelnden Augen 😃

    Hoffentlich wird's keinen Glaubenskrieg geben.

    mfg
    v R



  • Original erstellt von virtuell Realisticer:
    goto sollte schneller sein, da es eine normale jmp-Anweisung ist und nichts
    geprueft wird.

    ich glaube aber auch das ein compiler das erkennt und es entsprechend optimiert und nicht etwa einen vergleich von konstanten ausführt...



  • also gleichschnell, oder wie soll ich das jetzt verstehen? 😕



  • Es geht darum, dass deine Schleife endlos ist, da kann man keine Geschwindigkeiten messen.

    Angenommen ein goto braucht 2 mal solange wie while, dann würde man theoretisch behaupten können, sie braucht 2 unendlich, da 2 unendlich aber gleich unendlich ist (unendlich ist nicht steigerbar), ist es gleich.



  • Mein Name ist v R! Ich bin ein Prototyp T100 und bin Menschen ueberlegen.
    Ich sehe jeden Taktunterschied mit meinen weiterentwickelnden Augen

    ...jetzt wird's kindisch 😡 🙄



  • while(1)

    kein optimierender Compiler wuerde hier jedesmal testen ob 1 true ergibt...

    while(1);
    wird wegoptimiert
    bei
    label:
    goto label;
    bin ich mir nicht 100% sicher, sollte ein guter compiler aber auch erkennen...



  • hmm wenn ich nun aber eine endlosschleife will die einfach hängt?



  • Original erstellt von japro:
    hmm wenn ich nun aber eine endlosschleife will die einfach hängt?

    dem compiler sagen, dass er sie nicht wegoptimieren darf!

    Aber wozu sollte soetwas gut sein?



  • Warum sollten Compiler Endlosschleifen überhaupt wegoptimieren? Das Programm bekommt dadurch andere Semantik, also isses falsch. Der Compiler hat nicht zu mutmaßen was du meintest, wenn du ganz klar was anderes hingeschrieben hast.

    for(;;)
      ;
    destroy_universe(); /* lala */
    


  • Original erstellt von Bashar:
    **Warum sollten Compiler Endlosschleifen überhaupt wegoptimieren? Das Programm bekommt dadurch andere Semantik, also isses falsch. Der Compiler hat nicht zu mutmaßen was du meintest, wenn du ganz klar was anderes hingeschrieben hast.

    for(;;)
      ;
    destroy_universe(); /* lala */
    

    **

    wenn ich mir das hier durchlesen, dann glaube ich du hast was falsch verstanden, die meinen dass ein kompiler nur nen einfach jump macht und nicht jedesmal den vergleich durchführen würde bei while(true)...

    oder seh ich es nun falsch?

    rapso->greets();



  • Shades letzten Artikel muß ich so interpretieren.



  • Also ich weiss ja nicht ob das hilfreich ist, aber:

    #include <stdio.h>
    #include <windows.h>
    
    int main(void)
    {
        DWORD st;
        long c;
        long d=0;
        int versuche=10;
    
        for(int x=0; x<versuche; x++){
            c=100000000;
            st = GetTickCount();
            while(c){
              c--;
            }
            printf("%d ms\n", GetTickCount()-st);
            d+=GetTickCount()-st;
        }
        printf("---------\n%d ms", d/versuche);
    
        printf("\n\n");
        d=0;
    
        for(int x=0; x<versuche; x++){
            c=10000000;
            st = GetTickCount();
            los:
            c--;
            if(c>0) goto los;
            printf("%d ms\n", GetTickCount()-st);
            d+=GetTickCount()-st;
        }
        printf("---------\n%d ms", d/versuche);
    
        getchar();
        return 0;
    }
    

    Gibt bei mir folgende Ausgabe:

    410 ms
    411 ms
    400 ms
    401 ms
    390 ms
    411 ms
    391 ms
    420 ms
    401 ms
    390 ms
    ---------
    402 ms
    
    90 ms
    81 ms
    60 ms
    50 ms
    50 ms
    60 ms
    50 ms
    50 ms
    50 ms
    50 ms
    ---------
    59 ms
    

    womit doch eigentlich gezeigt wäre, dass goto schneller ist.
    bin mir da aber nicht sicher, ob das allzuviel mit dem Thema zutun hat... 😮

    cu para
    😃



  • Man kann das noch etwas optimieren, um den Unterschied *noch* deutlicher herauszustellen:

    Original erstellt von paranoiac.org:
    **```cpp
    #include <stdio.h>
    #include <windows.h>

    int main(void)
    {
    DWORD st;
    long c;
    long d=0;
    int versuche=10;

    for(int x=0; x<versuche; x++){
        c=100000000;
        st = GetTickCount();
        while(c){
          c--;
        }
        printf("%d ms\n", GetTickCount()-st);
        d+=GetTickCount()-st;
    }
    printf("---------\n%d ms", d/versuche);
    
    printf("\n\n");
    d=0;
    
    for(int x=0; x<versuche; x++){
        c=100;
        st = GetTickCount();
        los:
        c--;
        if(c>0) goto los;
        printf("%d ms\n", GetTickCount()-st);
        d+=GetTickCount()-st;
    }
    printf("---------\n%d ms", d/versuche);
    
    getchar();
    return 0;
    

    }

    Jetzt ist goto *noch* schneller. Cool oder?



  • Habs au gemerkt...
    🙄 🙄

    [ Dieser Beitrag wurde am 21.11.2002 um 15:16 Uhr von paranoiac.org editiert. ]



  • Das hängt einfach vom Compiler ab.
    Allerdings gibt es einen bedeutenden Unterschied zwischen:

    while (1)
     ;
    
    //und
    
    x:
     goto x;
    

    denn ';' ist ein "Befehl" Es sind also Programme gültig wie z.B.:

    int main ()
    {;
     ;
     ;
     ;
     ;
     ;
     ;
     return 0;
    }
    

    Normalerweise würde er dann die ';' in NOPs übersetzen, es kann aber auch sein, dass der Compiler die weckoptimiert. Da ja logisch kein Unterschied zwischen den beiden Konstrukten besteht.
    Also mein Compiler (BCC4.5.2) übersetzt die Anweisungen gleich. Hier der entscheidene Auszug:

    ;    
       ;     main ()
       ;    
       ;    
       ;    {
       ;     while (1)
       ;    
        ?debug L 3
    @1:
    @2:
        jmp short @2
       ;    
       ;      ;
       ;    
       ;     x:
       ;      goto x;
       ;    
        ?debug L 7
    @3:
        jmp short @3
       ;    
       ;    }
       ;    
        ?debug L 8
    @4:
        ret
    

    [ Dieser Beitrag wurde am 21.11.2002 um 15:48 Uhr von -bg- editiert. ]



  • Original erstellt von paranoiac.org:
    **Also ich weiss ja nicht ob das hilfreich ist, aber:

    while(c){
              c--;
            }
    
            los:
            c--;
            if(c>0) goto los;
    

    womit doch eigentlich gezeigt wäre, dass goto schneller ist.
    bin mir da aber nicht sicher, ob das allzuviel mit dem Thema zutun hat... 😮

    cu para
    :D**

    Allerdings ist das nicht fair weil ...
    beim goto hast Du c>0
    und beim while c ( sprich c != 0 )
    das müsste ohne Compiler-Optimierung verschiedenen assambler geben
    ausserdem ist der Goto eine Fuss-schleife und die while-schleife eine Kopfschleife.

    Gruß



  • Könnt ihr das mal lassen? Er hat einmal 10 Millionen und einmal 100 Millionen Durchläufe, ich dachte eigentlich mein Posting stellt das heraus, aber ich muß wohl noch deutlicher werden.


Anmelden zum Antworten