C++ のファイル I/O 操作は、C スタイルの I/O よりもはるかに遅いといつも聞いています。しかし、実際の速度が比較的遅いという実用的な参考文献が見つからなかったため、自分のマシン (Ubuntu 12.04、GCC 4.6.3、ext4 パーティション形式) でテストすることにしました。
まず、ディスクに ~900MB のファイルを書き込みました。
C++ ( ofstream
): 163 秒
ofstream file("test.txt");
for(register int i = 0; i < 100000000; i++)
file << i << endl;
C ( fprintf
): 12 秒
FILE *fp = fopen("test.txt", "w");
for(register int i = 0; i < 100000000; i++)
fprintf(fp, "%d\n", i);
私はそのような出力を期待していました.ファイルへの書き込みがCよりもC++ではるかに遅いことを示しています.次に、CおよびC++ I / Oを使用して同じファイルを読み取りました. ファイルからの読み取り中にパフォーマンスにほとんど違いがないことを私が叫んだ理由.
C++ ( ifstream
): 12 秒
int n;
ifstream file("test.txt");
for(register int i = 0; i < 100000000; i++)
file >> n;
C ( fscanf
): 12 秒
FILE *fp = fopen("test.txt", "r");
for(register int i = 0; i < 100000000; i++)
fscanf(fp, "%d", &n);
では、ストリームを使用した書き込みの実行に時間がかかるのはなぜですか? または、ストリームを使用した読み取りが書き込みに比べて非常に高速なのはなぜですか?
結論:std::endl
答えとコメントが指摘しているように、犯人はです。file << i << endl;
ラインを
変更すると、
file << i << '\n';
実行時間が 163 秒から 16 秒に短縮されました。