【发布时间】:2013-07-02 07:54:17
【问题描述】:
我一直听说 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,正如答案和 cmets 所指出的那样。换行
file << i << endl;
到
file << i << '\n'; 已将运行时间从 163 秒减少到 16 秒。
【问题讨论】:
-
你关闭优化了吗?也许在 ifstream 情况下编译器会看到您一直覆盖 n 并且只是移动文件指针而不实际从文件中读取?
-
叹息。 没有区别,你的基准有缺陷。如果有的话,C++ 格式的输入/输出更快。不是有无数个这样的副本吗?
-
我不否认
fstream比cstdio慢,但这些差异似乎比我从测量结果中预期的要大一些。不是您以低(或没有)优化级别运行的情况吗?由于流主要是通过模板实现的,因此它会被编译到您的代码中,其中cstdio类型的函数被编译到库中并具有更高级别的优化。 -
你在作弊。
std::endl比您在 fprintf 中输出的\n多。它导致流冲洗。所以试试file << i << '\n'