2013-05-03 32 views
11

私は実際にC++のファンですが、今日は私のプログラムのファイル出力が非常に遅いとわかりました。だから、私はCとC++ファイル出力の速度を比較する実験を設計し 私たちは、コードのこの部分があるとします。C++の出力がCよりも遅いのはなぜですか?

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

今、私は2つの別々のコード、C++での1を実行します。

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; 

Cで1つ:

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); 

C++プログラムは驚くほど遅く動作します。私のシステムでは、Cプログラムは3秒で実行され、C++プログラムは約50秒実行されます。 これについて合理的な説明はありますか?

+3

有効になっている最適化は何ですか? – Chad

+6

ベクトルを使用している場合は両方ともC++である古いCスタイルライブラリを使用しています –

+0

コンパイラで-Sオプションを使用してアセンブリファイルを確認したい場合は、 – aaronman

答えて

22

C++コードでストリームをディスクにフラッシュする頻度が高いためです。ストリームにendlを挿入すると、新しい行が挿入されてバッファがフラッシュされますが、fprintfはバッファフラッシュを発生しません。

C++の例では20,000,000回のバッファフラッシュが実行されますが、Cの例ではファイルのバッファがいっぱいになるとディスクにフラッシュされます。

+0

私は同意します - これはまさに問題の原因です。 – rohitsan

+0

ありがとうございます。では、C++コードをそれほど多くのバッファフラッシュを実行しないように変更する方法はありますか? もちろん、私はendlが必要です。だから何をすべきか? – user2345493

+2

@ user2345493 'endl'は必要ありません。代わりに' "\ n" 'を使うことができます。 http://stackoverflow.com/questions/213907/c-stdendl-vs-n – shf301

関連する問題