我一直听说 C++ 文件 I/O 操作比 C 风格的 I/O 慢得多。但是我没有找到任何关于它们实际上有多慢的实用参考,所以我决定在我的机器上测试它(Ubuntu 12.04,GCC 4.6.3,ext4 分区格式)。
首先我在磁盘上写了一个~900MB 的文件。
C++ ( ofstream
): 163s
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 秒。