Newsgroup: it.comp.lang.c
Titolo: OS o compilatore?

Ho provato a compilare un semplice codice che impegnasse molto la CPU e ho
notato che lo stesso codice compilato in Linux e' circa 2 o 3 volte piu'
veloce dello stesso compilato sia per DOS che per Windows 9/x.
Qualcuno sa dirmi se e' Linux ad essere piu' veloce sia del DOS che di
Windows, oppure se si tratta del compilatore GCC che e' molto buono?
Per compilarlo sotto DOS e Windows ho usato i compilatori Microsoft, Borland
e Watcom e ho ottenuto piu' o meno gli stessi risultati.
Il codice che ho utilizzato era una serie lunghissima di cicli loop che
eseguiva operazioni semplici, come scrivere lo stesso dato in una variabile.
Inoltre ho settato tutte le opzioni di ottimizzazione di tutti i compilatori
(su GCC mi sembra -O).
Grazie a tutti.
Ciao

e Watcom e ho ottenuto piu' o meno gli stessi risultati.
Se ti interessa, esiste un porting di GCC per Windows 9x / NT, fatto dalla
Cygnus.
Non ricordo l'url esatto, ma con una piccola ricerca sui principali motori
lo dovresti trovare (mi sembra 
www.cygnus.com
).
In questo modo ti potresti togliere la curiosita' sul compilatore, usando
gcc anche su Win
Ciao
Beppe


ICQ #34602650


Hai compilato il codice C a 16 o  32 bit?
Se a 16 bit con che modello di memoria?
Cosa usi per calcolare il tempo di esecuzione in ciascun sistema operativo?
Se puoi posta il codice, che ripetiamo l'esperimento.
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own    

Ho provato a fare altri test e forse il problema e' dovuto ai compilatori.
Mi sembra che le differenze principali siano sul formato a virgola mobile.
Ho provato con questo codice:
#include <stdio.h>
int main()
{
float i,i1;
char a;
for(i=0;i<1000000;i++)
for(i1=0;i1<40;i1++)
a=0;
printf("OK");
return 0;
}
Ed ecco i risultati sul tempo di esecuzione sul mio Pentium 133 (a occhio,
tanto e' uguale :-))
Watcom / VC++: 7 sec.
C++ Builder: 19 sec.
GCC: 4 sec.
I risultati migliori li ho avuti con GCC e i peggiori con CB, che, pur
avendo delle opzioni di ottimizzazione per il tipo float come tutti gli
altri, non sembra prenderle in considerazione.
Se riuscite ad ottenere diversi risultati fatemelo sapere.
Ciao.

 a=0;
Un compilatore nemmeno troppo furbo dovrebbe sostituire i due loop
annidati con l'unica istruzione "a=0".  Hai controllato CHE CODICE
GENERANO i tuoi?
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

Mi sembra che le differenze principali siano sul formato a virgola mobile.
E' strano, perche' credo che quasi tutti i compilatori C adottino lo
standard ANSI/IEEE 754.
Comunque dovresti modificare il programma per fargli calcolare il
tempo di esecuzione in modo automatico.
Solo cosi' hai dati affidabili.

Ho modificato il codice come suggerito da Andrea Laforgia. Il codice
modificato e' questo:
#include <stdio.h>
#include <time.h>
int main()
{
float Start,End;
float i,i1;
char a;
Start=clock();
for(i=0;i<1000000;i++)
for(i1=0;i1<40;i1++)
a=0;
End=clock();
printf("%f",(End-Start)/CLK_TCK);
return 0;
}
I risultati sono questi (sempre su un P133):
Windows con Watcom / VC / CB: 6.2 sec. circa.
Linux con GCC: 3.7 sec. circa.
Adesso i valori ottenuti con C++ Builder (versione 3.0) sono diversi da
quelli ottenuti con il primo programma e si equivalgono con quelli degli
altri compilatori. La differenza era dovuta all'ultima riga di codice:
printf("OK");.
Sostituendola con printf("%c",a) (o "%f" come in questo caso) la lentezza
del programma scompare.
Che sara' un bug? Mi sembra strano, anche perche' all'apparenza sembrerebbe
un motivo assurdo.
Apparte questo, la velocita' di GCC sembra essere comunque superiore.
A questo punto non ci capisco piu' molto. Voi che ne dite?

 GENERANO i tuoi?
Non solo, ma un buon ottimizzatore dovrebbe ridurre tutto il codice a:
  main()
  {
    printf("Ok");
    return 0;
  }
dato che l'utilizzoo di i, i1, ed a non porta a nessun
risultato utile.
Probabilmente, un test migliore sarebbe qualcosa come:
{ 
 float i, i1;
 char a;
 for (i = 0; i < 10000; ++i)
  for (i1 = 0; i1 < 40; ++i1)
   a+= (char)(i + i1)
 
 printf ("%d", (int)a); /* Usa la variabile */
 printf ("OK!");
}
Se invece vuoi fare "perdere" la gara ai compilatori 
Borland a 32 bit, puoi provare:
main()
{ 
 float i, i1;
 unsigned char a;
 double PI = atan(1)*4.;
 for (i = 0; i < 10000; ++i)
  for (i1 = -PI; i1 < PI; i1 += (PI/50))
   a+= (unsigned long)( (i) * sin(i1) )
 
 printf ("%d", (int)a);
 printf ("OK!");
}
Aldo.


 la velocita' di GCC sembra essere comunque superiore.
[OT]: Huge satisfaction !!!!!!!    ;-P
Ave,
E.
-------
Stat rosa pristina nomine, nomina nuda tenemus.