C 和 C++ 风格文件 IO 之间的性能差异

2024-02-03

我一直听说 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): 12s

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): 12s

int n;
ifstream file("test.txt");

for(register int i = 0; i < 100000000; i++) 
    file >> n;

C (fscanf): 12s

FILE *fp = fopen("test.txt", "r");
    
for(register int i = 0; i < 100000000; i++) 
    fscanf(fp, "%d", &n);

那么,为什么使用流执行写入要花这么长时间呢?或者,为什么使用流读取比写入快?

结论:罪魁祸首是std::endl,正如答案和评论所指出的。改变线路file << i << endl; to file << i << '\n';运行时间从 163 秒减少到 16 秒。


你正在使用endl打印换行符。这就是问题所在,因为它确实如此more不仅仅是打印换行符 -endl also flushes缓冲区是一项昂贵的操作(如果您在每次迭代中都这样做)。

Use \n如果你的意思是这样:

file << i << '\n';

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C 和 C++ 风格文件 IO 之间的性能差异 的相关文章

随机推荐

  • Silverlight:FrameworkElement.FindName() 在浏览器窗口中不“可见”时找不到控件

    我遇到一个问题 我使用 FrameworkElement 对象的 FindName 方法来搜索该元素的子控件 我注意到了一些有趣的行为 但似乎无法弄清楚 如果用户滚动浏览器窗口 使得控件本身在窗口框架的上下文中不再明显显示 则 FindNa
  • “let”类陷入无限循环

    请原谅代码中的任何愚蠢错误 因为这是我第一次尝试使用类 而且我在网上找不到任何真正将其放入其中的教程 really对于像我这样的傻瓜来说 简单的术语 我尽力遵循 MS 指南 https msdn microsoft com en us li
  • c:forEach 在 tomcat 7 中不起作用

    我使用创建了简单的页面c forEach标签 它在 tomcat 6 中工作 但是not working tomcat 7 使用 JSF 2 0 开发简单的 Web 应用程序 我在 tomcat 6 中运行我的代码 它可以工作 我部署在 t
  • 为什么 Array.Copy 支持长参数

    来自MSDN http msdn microsoft com en us library btfeahds VS 80 aspx 参数 源数组 包含数据的数组 复制 目的地数组 接收数据的数组 长度 一个 64 位整数 表示 要复制的元素数
  • 使用数据源将文本添加到组合框

    我有一个 vaadin 组合框 里面装有容器数据源 setContainerDataSource container 我现在想在结果列表中的某处插入静态文本 例如 一个组合框充满了一个容器 结果列表中弹出的第一个条目是某种标题 Person
  • 从 python 字典列表中选择单个字段

    假设我有一个字典列表 如下所示 dictionList 1 Type Cat Legs 4 2 Type Dog Legs 4 3 Type Bird Legs 2 使用 for 循环 我想迭代列表 直到捕获带有 a 的字典Type场等于
  • CSS:增加上边距

    我正在尝试以楼梯类型的方式错开 div 类 所以它看起来像这样 1 2 3 4 编辑 我想更改上边距 以便 process div 的每个位置都低于之前的位置 我让它们浮动 这样它们就可以并排坐着 但我也希望每个 div 都比上一个更低 我
  • FastText 使用预先训练的词向量进行文本分类

    我正在研究文本分类问题 也就是说 给定一些文本 我需要为其分配某些给定的标签 我尝试过使用 Facebook 的快速文本库 它有两个我感兴趣的实用程序 A 带有预训练模型的词向量 B 文本分类实用程序 然而 这些似乎是完全独立的工具 因为我
  • Overpass api 来查找坐标的速度限制?

    我收到车辆的坐标 我需要找出该车辆所在道路的速度限制 我知道你可以找到某个有界框的最大速度 如下所示 www overpass api de api xapi 最大速度 bbox 5 6283473 50 5348043 5 6285261
  • 通过 JQuery 选择 select 中的选项

    我有一个包含以下选项的选择
  • 启用对非公共 Google Cloud Function 的令牌访问

    我想部署一个没有公共访问权限的 Google Cloud Function 服务帐户应该能够以最少的权限调用该功能 由外部服务器使用 我已经创建了一个服务帐户 添加了绑定并下载了密钥 gcloud iam service accounts
  • Puppeteer 启动器错误结果未定义

    在 Windows 上测试我的项目后 我将其部署到基于 Ubuntu 的虚拟机上 这就是 Puppeteer 行为让我感到困惑的地方 我确实安装了所有必需的依赖项 但我有一种感觉 我的错误不一定是由于缺乏依赖项以及更多有关配置问题而引起的
  • PyCharm:为什么只显示退出代码行?

    例如 运行以下代码行 print Hello world My name is Enkouyami 只输出这个 Process finished with exit code 0 让它显示该文本的唯一方法是转到 python 控制台 我的
  • 在 Ubuntu 18.x 和 R 3.4.4/3.5.1 上安装 tidyverse

    我尝试安装 tidyverse 以及组成 tidyverse 的软件包 并得到以下输出 gt install packages tidyverse dependencies TRUE type source Installing packa
  • 在PHP应用程序中以安全的方式存储MYSQL的密码

    我有一个从代码连接到数据库的 php 应用程序 我想知道存储这些凭据的安全方法是什么 这是一个Linux服务器 编辑 我只想听到一些知情的意见 以便自己获得知情的意见 以便与我的团队讨论 我反对加密任何密码 但我的团队并不相信 我认为如果密
  • 使用 Autofac 进行 XUnit 测试构造函数依赖注入

    我正在使用 Autofac 实现 Xunit 我可以通过以下代码使其工作 using var scoped DbFixture Container Resolve
  • 使用批处理脚本在 Windows 中添加注册表项,并在数据中添加所需的引号

    小威利斯在这里 我正在尝试使用批处理脚本来编辑双击 jar 文件时使用的现有注册表项 问题是我尝试输入的数据包含引号 但我还需要引号才能将其视为字符串 Example reg add HKEY LOCAL MACHINE Software
  • 带有 ng-repeat 指令的容器高度为零

    我有一个带有 ng repeat 指令的 div 它会遍历一个数组并向我的容器添加一堆 div 当我打电话时 height 在现在充满 div 的容器上 它返回 0 它似乎返回 ng repeat 指令执行之前的高度 将 ng repeat
  • 如何翻转单个UIView(不翻转父视图)

    这是一个 iPad 项目 其中我有一个带有多个子视图的 UIView 我正在尝试使用 UIView transitionFromView toView duration options completion 为其中一个 UIView 制作动
  • C 和 C++ 风格文件 IO 之间的性能差异

    我一直听说 C 文件 I O 操作比 C 风格的 I O 慢得多 但我没有找到任何实际参考来说明它们实际上有多慢 所以我决定在我的机器上测试它 Ubuntu 12 04 GCC 4 6 3 ext4分区格式 首先 我在磁盘中写入了约 900