我一直听说 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 秒。
最佳答案
您正在使用 endl
打印换行符。这就是这里的问题,因为它 more 不仅仅是打印换行符 - endl
还 flushes 缓冲区,这是一个昂贵的操作(如果你在每次迭代中都这样做)。
使用 \n
如果你的意思是这样的话:
file << i << '\n';
而且,必须在 Release模式下编译您的代码(即打开优化)。
关于c++ - C 和 C++ 样式文件 IO 之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468088/