c++ - C 和 C++ 样式文件 IO 之间的性能差异

标签 c++ c file-io stream

我一直听说 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 不仅仅是打印换行符 - endlflushes 缓冲区,这是一个昂贵的操作(如果你在每次迭代中都这样做)。

使用 \n 如果你的意思是这样的话:

file << i << '\n';

而且,必须在 Release模式下编译您的代码(即打开优化)。

关于c++ - C 和 C++ 样式文件 IO 之间的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17468088/

相关文章:

c++ - 我想在C++中实现map,因为我无法检查 vector 大小并为我制作的 vector 提供值

c++ - 如何判断 stderr 是否已在 Windows 中重定向?

c - 如何研究图数据结构和 BFS & DFS

html - 如何在不使用 libcurl 的情况下从本地主机服务器获取 URL

c++ - SDL2_ttf 错误 : Entry point not found

c++ - QProgressDialog 栏在完成时重置为零

c - 数组和结构体

javascript - 关闭Excel而不提示javascript

c - 经常使用文件定位功能来翻转文件

windows - 创建虚拟文件夹并将它们挂接到文件系统