GOTO ist nicht langsam



  • hi leute ich hab mir mal gedacht ich schau mal ob goto eigentlich langsamer ist als while und for und min zu dem schluss gekommen das ist nicht so:
    schleife mit goto laufzeit: 2.48

    #include <stdio.h>
    #include <time.h>
    
    int main(void){
    	long lauf = 0;
    	clock_t prgstart, prgende;
    	prgstart = clock();
    	incoming:
    	if(lauf == 999999999){
    		prgende = clock();
    		printf("Laufzeit: %.2f\n", (float)(prgende-prgstart) / CLOCKS_PER_SEC);
    		return 0;
    	}//end main
    	lauf++;
    	goto incoming;//end goto schleife
    }//end main
    

    schleife mit while: laufzeit: 2.48

    #include <stdio.h>
    #include <time.h>
    
    int main(void){
    	long lauf = 0;
    	clock_t prgstart, prgende;
    	prgstart = clock();
    	while(lauf <= 999999999){
    		lauf++;
    	}//end while
    	prgende = clock();
    	printf("Laufzeit: %.2f\n", (float)(prgende-prgstart) / CLOCKS_PER_SEC);
    }//end main
    

    schleife mit for laufzeit: 2.85

    #include <stdio.h>
    #include <time.h>
    
    int main(void){
    	long lauf;
    	clock_t prgstart, prgende;
    	prgstart = clock();
    	for(lauf = 0; lauf <= 999999999; lauf++){
    	}//end for
    	prgende = clock();
    	printf("Laufzeit: %.2f\n", (float)(prgende-prgstart) / CLOCKS_PER_SEC);
    }//end main
    

    daraus sieht mann dass die for schleife eindeutig am langsamsten ist und die goto und while schleife gleich auf sind was sagt ihr dazu?
    ich weiß dass goto unelegant ist aber ausprobieren kann mans ja mal zum testen oder? 😃
    ps ich habe keine compilereinstellung vorgenommen dadurch haben alle drei schleifen die selben vorraussetzungen



  • #include <stdio.h>
    #include <time.h>
    
    int main(void){
        long lauf = 999999999;
        clock_t prgstart, prgende;
        prgstart = clock();
        for(; lauf != 0; --lauf){
        }//end for
        prgende = clock();
        printf("Laufzeit: %.2f\n", (float)(prgende-prgstart) / CLOCKS_PER_SEC);
    }//end main
    

    🙄

    Btw ist es eh egal... Im Vergleich dazu was der Schleifenkörper hat ist das normalerweise "kein Unterschied". Compiliert wird es eventuell sogar gleich sein. Man verwendet normal immer die Schleife die dem Zweck am Besten entspricht da der Code dadurch an Lesbarkeit gewinnt.



  • lol, du Nase, was meinst du wie goto und die anderen Schleifen intern realisiert sind? Genau, gleich!

    Der Grund für die nicht-Verwendung von goto ist nicht die Geschwindigkeit, sondern dass es den Code unleserlich und unübersichtlich bis unwartbar macht.



  • verwende goto, wenn es ne bessere lösung als eine schleife ist.
    aja, und lass dich keinesfalls auf solche glaubenskriege ein, ob goto nun gut oder schlecht ist.
    das beste ist, wenn du es wie selbstverständlich verwenden kannst, aber genau weißt, wenn schleifen nicht ausreichen.



  • _JEDE_ GoTo-Konstruktion lässt sich durch eine Schleife ersetzten.



  • --linuxuser-- schrieb:

    daraus sieht mann dass die for schleife eindeutig am langsamsten ist und die goto und while schleife gleich auf sind was sagt ihr dazu?

    Was ich dazu sage? Deine Messung ist falsch! Da goto, for und while den Selben Maschienen Code ergeben, frag ich mich, woher die 15% Unterschied herkommen. Der Grund ist, dass du die Variable bei while und goto vor der Zeitmessung initialisierst. Bei der For Schleife tust du es erst wärend der Zeitmessung.



  • @FireFlow:
    Verallgemeinerungen sind ne heikle Sache. Ich wäre an deiner Stelle vorsichtig, zumal du nicht im Geringsten vorahnen kannst, welche Situationen man nur mit einem goto lösen kann und welche besser mit Schleifen. Führ dir meinen Satz von wegen "Glaubenskrieg" besser nochmal zu Gemüte und dann denke "Mittelweg".

    Ich möchte mit einem treffenden Zitat abschließen:
    "Man sollte viele Dinge von mehreren Standpunkten betrachten um sie ganz zu durchschauen."

    @ProgChild: Zeitmessungen... der sinnvollste Vergleich ist, die Möglichkeiten von einem Compiler in Assembly umsetzen zu lassen. Mach dich wegen solchen Vergleichsmethoden nicht irre.



  • FireFlow schrieb:

    _JEDE_ GoTo-Konstruktion lässt sich durch eine Schleife ersetzten.

    So ist es 👍

    Acuh wenn c.rackwitz das nicht kann, ein nicht-noob kann das.



  • FireFlow schrieb:

    _JEDE_ GoTo-Konstruktion lässt sich durch eine Schleife ersetzten.

    Dann zeig mal her:

    label1:
    a();
    if (bedingung2()) goto label2;
    b();
    if (bedingung1()) goto label1;
    label2:
    


  • Ich bin mal so frei:

    do
    {
      a();
      if (bedingung2()) break;
      b();
    }
    while (bedingung1());
    

    Sonst noch was? 🙄



  • do
    {
    	a();
    
    	if(bedingung2()) break;
    
    	b();
    
    } while(bedingung1());
    


  • sorry Dingo, ich war zu spät 😃



  • hohesC schrieb:

    sorry Dingo, ich war zu spät 😃

    immerhin sind wir uns einig 😃 👍





  • @Mahlzeit: lol, warum denn gleich beleidigend werden? gehen dir die argumente aus? sprich mich im icq an, dann reden wir weiter. kannst dich auch mal hier im forum anmelden, damit du nicht mehr so anonym bist...

    hohesC hat einen guten link gepostet. exceptions oder mehrfache breaks emuliert man am schnellsten mit gotos. mehr wollte ich nicht ausdrücken.

    davon abgesehen... wieso seid ihr alle so verdammt militant?
    wenn einer gotos nehmen will, lasst ihn.
    wenn einer gotos hasst, lasst ihn.



  • @FireFlow:

    Foo * foo = NULL;
    goto entry;
    
    do
    {
      Process(foo);
    entry:
      foo = GetNextFoo();
    } while (foo);
    

    _ohne_ ProcessFoo oder GetNextFoo 2x zu verwenden



  • Foo * foo = NULL;
    
    while(foo = GetNextFoo())
      Process(foo);
    

    naja, das bekomm ich schon noch besser ohne goto hin.



  • GetNextFoo() ist bei mir leider ein mehrzeiler 😕



  • ...
    ...
    while(a)
    {
       while(c)
       {
          while(d)
          {
              if (e)
                 goto fertig;
          }
       }
    }
    fertig:
    ...
    ...
    


  • while(a) 
    	{ 
    		while(c) 
    		{ 
    			while(d) 
    			{ 
    				if(e)break;
    			}
    			if(e)break;
    		}
    		if(e)break;
    	}
    

    auch wenns mehr code ist, lässt sich einfach ersetzen!


Anmelden zum Antworten