Newsgroup: it.comp.lang.c++
Titolo: compilatore C++ piu' lento del compilatore C

Salve,
Ho un piccolo problema: come mai questo programma
---------------------------------------------------
#include <stdio.h>
int main()
{
    int i;
    float f = 1.0;
    for(i = 0; i < 2000000; i++)
      printf("%f\n", f);
    return 0;
}
---------------------------------------------------
quando viene compilato con un compilatore C e' piu' veloce e piu'
piccolo di quando viene compilato con un compilatore C++?
Per essere precisi, sto usando il compilatore egcs (versione 2.91.60)
su Linux/Debian, e questi sono i risultati:
[C]
  $
  $ gcc -O2 main2.c
  $ ls -l a.out
  -rwxr-xr-x   1 diego    diego        4622 Jun  6 16:01 a.out
  $ time ./a.out > /dev/null
  real    0m12.851s
  user    0m12.840s
  sys     0m0.010s
[C++]
  $
  $ g++ -O2 main2.c
  $ ls -l a.out
  -rwxr-xr-x   1 diego    diego        4926 Jun  6 16:02 a.out
  $ time ./a.out > /dev/null
  real    0m13.613s
  user    0m13.600s
  sys     0m0.020s
(ovviamente ho fatto varie prove per misurare il tempo, tutte nelle
stesse condizioni, e tutte hanno dato piu' o meno gli stessi
risultati).
Ringrazio in anticipo chiunque riuscira' a spiegare il mistero... Ciao,
-- 
Diego Dainese
-> Per le repliche elimina dal mio indirizzo le cifre e le `x'.
-> ATTENZIONE: se non ricevete risposta ad un messaggio che avete
   rivolto a me, probabilmente la colpa e' del server del mio ISP,
   quindi per favore fatemi un CC del messaggio in email, grazie.


ICQ #34602650

 piccolo di quando viene compilato con un compilatore C++?
Ho rifatto la prova con gcc 2.7.2 / egcs 2.90.27 (non dovrebbe cambiare
rispetto ai tuoi compilatori).
Ho compilato in due passi, creando prima il file .o e poi l'eseguibile.
Nei .o l'unica differenza e' che quello compilato con il g++ contiene
56 byte di dati (non codice) in piu'; il codice di main e' identico.
   text    data     bss     dec     hex filename
     48      56       0     104      68 prova.o       // C++
     48       0       0      48      30 prova-c.o     // C
Visto che il codice generato era lo stesso (controllato con objdump),
ho pensato che la differenza di prestazioni fosse dovuta alle librerie
usate e a eventuali operazioni di inizializzazione e/o cleanup.
Ho creato 4 eseguibili, linkando ciascuno dei 2 .o sia con il compilatore
C che con quello C++.
Come si puo' notare la differenza dipende dal link, a parita' di link
ci sono solo quei 56 byte di dati in piu'.
In teoria le librerie usate dovrebbero essere le stesse (il programma
chiama solo la printf), e quasi 2 secondi sono troppi per essere 
spiegati con operazioni di init/cleanup.
Forse in C++ la printf fa qualche operazione in piu' per tenersi
sincronizzata con eventuali operazioni su iostream...
   text    data     bss     dec     hex filename
   1348     284      28    1660     67c prova     // g++
   1348     228      28    1604     644 prova-y   // comp gcc, link g++
   1038     244       4    1286     506 prova-x   // comp g++, link gcc
   1038     188       4    1230     4ce prova-c   // gcc
46.46user 0.04system  // g++
46.62user 0.07system  // gcc, g++
44.88user 0.02system  // g++, gcc
44.87user 0.02system  // gcc
	Mauro

   sys     0m0.020s
La dimensione del programma è veramente piccola! Devo dedurre che l'egcs
sia molto migliore del djgpp. Comunque lo scarto tra C e C++ mi sembra
irrisorio. La differenza di velocità invece, seppur molto ridotta, mi
rende perplesso...
EMG

 
Mah, per me rimane un bel mistero.
Comunque grazie a tutti per le risposte, ciao


sia molto migliore del djgpp. Comunque lo scarto tra C e C++ mi sembra
Ma il djgpp e relative utility non linka tutte le librerie
staticamente?
In questo caso e` OVVIO che il codice sia piu` grande per il sistema
di DJ Delorie.
Inoltre se non sbaglio DJGPP usa le versioni di gcc e gpp intorno alla
2.81
Se le mie info sono vecchie qualcuno e` pregato di aggiornarmi.....
-- 
Gargamella alias Massimo Lauria
"Non e` bello cio` che e` bello, ma e` bello cio` che piace... a me!"
remove *dinkyisland* from address to mail me

dipendenze con 2 librerie in piu' rispetto a quando si linka con il C:
g++ linka le libstdc++.so  di default mi pare


 g++ linka le libstdc++.so  di default mi pare
Si, ma il programma non le usa (altrimenti non funzionerebbe senza).
Quindi e' normale che sia un po' piu' grande, ma non si spiega perche' 
va piu' piano.
Ho provato a linkare con il g++, ma con l'opzione -nostdlib, che
esclude dal link le librerie standard. Per fargli trovare la
printf ho dovuto aggiungere -lc (linka con libc).
  mauro ~/lang/c++ 520>g++ -nostdlib -o prova-z prova.o -lc
  /usr/bin/ld: warning: cannot find entry symbol _start; defaulting to 08048214
  mauro ~/lang/c++ 521>size prova-z
     text    data     bss     dec     hex filename
      367     168       0     535     217 prova-z
L'eseguibile prodotto e' molto piu' piccolo di tutte le altre versioni,
e probabilmente gli manca qualcosa (vedi warning).  Comunque il ciclo
viene eseguito regolarmente e va alla stessa velocita' di quelli
linkati C (forte).
	Mauro

 2.81
Si, la 2.8.1b.
EMG

 
Anche da me in fase di linking da quel warning e l'eseguibile e' molto
piu' piccolo (quasi la meta'!), pero' il ciclo e' lo stesso piu'
lento, e va addirittura in segmentation fault.
Credo che a questo punto la spiegazione piu' logica sia che in C++ per
usare le funzioni della libc bisogna passare per un wrapper che
comporta questo piccolo overhead (almeno sulla printf, non ho provato
altre funzioni).
Ciao,
