2013-05-03 18 views
11

In realtà sono un fan del C++, ma oggi ho trovato un output di file molto lento del mio programma. Così, ho progettato un esperimento per confrontare la velocità di output del file C++ con C. Supponiamo di avere questo pezzo di codice:Perché l'output C++ è troppo più lento di C?

int Num = 20000000; 
vector <int> v; 
for (int i = 0; i < Num; i++) 
{ 
    v.push_back(i); 
} 

Ora scappo due codice separato, uno in C++:

int now = time(0); 
cout << "start" << endl; 
ofstream fout("c++.txt"); 
for(size_t i = 0; i < v.size(); ++i) 
{ 
    fout<< v[i] << endl; 
} 
fout.close(); 
cout << time(0) - now << endl; 

e uno in C:

int now = time(0); 
printf("start\n"); 
FILE *fp = fopen("c.txt", "w"); 
for(size_t i = 0; i < v.size(); ++i) 
{ 
    fprintf(fp, "%d\n", v[i]); 
} 
fclose(fp); 
printf("%ld\n", time(0) - now); 

Il programma C++ funziona sorprendentemente più lentamente! Sul mio sistema, il programma C viene eseguito in 3 secondi mentre il programma C++ impiega circa 50 secondi per essere eseguito! Esiste una spiegazione ragionevole per questo?

+3

Quali ottimizzazioni sono abilitate? – Chad

+6

entrambi sono C++ se stai usando i vettori, stai solo usando le vecchie librerie in stile C in C++ –

+0

Se vuoi davvero sapere usa l'opzione -S nel compilatore per vedere il file assembly. – aaronman

risposta

22

È probabile a causa della frequenza con cui si esegue il flush del flusso su disco nel codice C++. L'inserimento di endl in uno stream inserisce una nuova riga e svuota il buffer, mentre fprintf non causa uno svuotamento del buffer.

Quindi l'esempio C++ esegue 20.000.000 svuotamenti di buffer mentre l'esempio C arriverà solo su disco quando il file gestisce il buffer è pieno.

+0

Sono d'accordo: questo è esattamente il problema. – rohitsan

+0

Grazie per la risposta. Quindi, come posso cambiare il codice C++ in modo tale che non esegua quel tanto di risciacquo del buffer? Certo, ho bisogno del finale. Quindi cosa dovrei fare? – user2345493

+2

@ user2345493 Non hai bisogno di 'endl', puoi invece usare' "\ n" '. Vedi http://stackoverflow.com/questions/213907/c-stdendl-vs-n – shf301

Problemi correlati