Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Tutto e di + - for o while
Forum - Tutto e di + - for o while

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:50
Venerdì, 25/03/2016
Ho cercato su google ma ho trovato discordie fra le varie ipotesi.
Chiedo a voi se avete già sperimentato qualcosa del genere.

E' piu veloce un ciclo for o un while?

Codice sorgente - presumibilmente Plain Text

  1. for( ; ; )
  2. {
  3.  
  4. }



o

Codice sorgente - presumibilmente Plain Text

  1. While(true)
  2. {
  3.  
  4. }





https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 10:25
Venerdì, 25/03/2016
Immagino dipenda dall'architettura e dal compilatore, comunque ho fatto una veloce prova con GCC (MingW perchè sono su Windows) su x86_64 e l'assembly generato è identico, quindi penso si possa dedurre che non c'è alcuna differenza.
In altre parole ho fatto:
test.c
Codice sorgente - presumibilmente Tutto e di +

  1. #include <stdio.h>
  2.  
  3. int main(){
  4.         for(;;){
  5.                 printf("ciao\n");
  6.         }
  7.         return 0;
  8. }


test1.c
Codice sorgente - presumibilmente Tutto e di +

  1. #include <stdio.h>
  2.  
  3. int main(){
  4.         while(1){
  5.                 printf("ciao\n");
  6.         }
  7.         return 0;
  8. }


Eseguito i comandi
Codice sorgente - presumibilmente Plain Text

  1. gcc -S test.c
  2. gcc -S test1.c


E ottenuto i seguenti risultati:
test.s
Codice sorgente - presumibilmente Tutto e di +

  1. .file   "test.c"
  2.         .def    __main; .scl    2;      .type   32;     .endef
  3.         .section .rdata,"dr"
  4. .LC0:
  5.         .ascii "ciao\0"
  6.         .text
  7.         .globl  main
  8.         .def    main;   .scl    2;      .type   32;     .endef
  9.         .seh_proc       main
  10. main:
  11.         pushq   %rbp
  12.         .seh_pushreg    %rbp
  13.         movq    %rsp, %rbp
  14.         .seh_setframe   %rbp, 0
  15.         subq    $32, %rsp
  16.         .seh_stackalloc 32
  17.         .seh_endprologue
  18.         call    __main
  19. .L2:
  20.         leaq    .LC0(%rip), %rcx
  21.         call    puts
  22.         jmp     .L2
  23.         .seh_endproc
  24.         .ident  "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.1.0"
  25.         .def    puts;   .scl    2;      .type   32;     .endef


test1.s
Codice sorgente - presumibilmente Tutto e di +

  1. .file   "test1.c"
  2.         .def    __main; .scl    2;      .type   32;     .endef
  3.         .section .rdata,"dr"
  4. .LC0:
  5.         .ascii "ciao\0"
  6.         .text
  7.         .globl  main
  8.         .def    main;   .scl    2;      .type   32;     .endef
  9.         .seh_proc       main
  10. main:
  11.         pushq   %rbp
  12.         .seh_pushreg    %rbp
  13.         movq    %rsp, %rbp
  14.         .seh_setframe   %rbp, 0
  15.         subq    $32, %rsp
  16.         .seh_stackalloc 32
  17.         .seh_endprologue
  18.         call    __main
  19. .L2:
  20.         leaq    .LC0(%rip), %rcx
  21.         call    puts
  22.         jmp     .L2
  23.         .seh_endproc
  24.         .ident  "GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.1.0"
  25.         .def    puts;   .scl    2;      .type   32;     .endef


Per trovare le differenze ho lanciato da shell MSYS:
Codice sorgente - presumibilmente Plain Text

  1. diff test.s test1.s


E ho ottenuto come output:
Codice sorgente - presumibilmente Plain Text

  1. 1c1
  2. <       .file   "test.c"
  3. ---
  4. >       .file   "test1.c"


Ovvero l'unica differenza è (ovviamente) nel nome del file sorgente che viene lasciato nell'assembly (se non sbaglio) come informazione di debug.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:22
Venerdì, 25/03/2016
I compilatori moderni ottimizzano parecchio e quindi non vedrai mai differenze di codice in questi casi.

E' solo una questione di chiarezza sintattica ... in questo caso mi sembra più chiaro il ciclo while


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:22
Venerdì, 25/03/2016
In realtà alcuni compilatori trasformano il for in un while PRIMA di processare il sorgente, in questo modo il risultato della compilazione sarà completamente identico sia in caso di while che in caso di for.

Comunque trovo il for più leggibile e comodo, perchè il ciclo è riassunto in una sola riga.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 11:28
Venerdì, 25/03/2016
Testo quotato

Postato originariamente da TheDarkJuster:
Comunque trovo il for più leggibile e comodo, perchè il ciclo è riassunto in una sola riga.



Le preferenze personali vanno bene ma c'è qualcosa che non capisco ....

Questo

for( ; ; )

è più chiaro di

while(true)

?? A me sembra l'esatto opposto e sono entrambi di una riga ...

Ultima modifica effettuata da nessuno il 25/03/2016 alle 11:29


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 11:50
Venerdì, 25/03/2016
perchè il for si preferisce usarlo quando hai bisogno di cicli con numero di esecuzioni finito....

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:06
Venerdì, 25/03/2016
Testo quotato

Postato originariamente da TheDarkJuster:

perchè il for si preferisce usarlo quando hai bisogno di cicli con numero di esecuzioni finito....



Bella questa .... e

for ( ; ; )

ti sembra che sia un ciclo finito?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
TheDarkJuster (Member)
Guru^2


Messaggi: 1620
Iscritto: 27/09/2013

Segnala al moderatore
Postato alle 12:13
Venerdì, 25/03/2016
No, mi riferivo alla leggibilità:

Codice sorgente - presumibilmente Tutto e di +

  1. for (int i=0; i<k; i++) {
  2.     step();
  3. }



Codice sorgente - presumibilmente Tutto e di +

  1. int i=0;
  2. while ( i<k) {
  3.     step();
  4.     i++;
  5. }



Nell'esempio è facile capire quante volte sia eseguito step() però nel caso del for è più immediato da capire: la scrittura è più compatta ed espressiva.

Però ti "aiuta" più del while nello scrivere invariante pre/post condizione di un ciclo......

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6403
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 12:31
Venerdì, 25/03/2016
Ah ... io mi riferivo al caso specifico di ciclo infinito indicato nel thread ... preferivo la while in "questo" caso.

Tuttavia anche negli altri casi, la cosa è opinabile perché possono intervenire tanti fattori ... ad esempio

Codice sorgente - presumibilmente Tutto e di +

  1. for (int i=0; i<k; i++)
  2. {
  3.      step();
  4.      i--; // incluso chissà dove nel ciclo ...
  5. }



oppure puoi scrivere la while meglio ...

Codice sorgente - presumibilmente Tutto e di +

  1. int i=0;
  2. while (i++<k)
  3.    step();



Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo