std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)?

2023-11-21

我测试了两种写入配置:

  1. Fstream缓冲:

    // Initialization
    const unsigned int length = 8192;
    char buffer[length];
    std::ofstream stream;
    stream.rdbuf()->pubsetbuf(buffer, length);
    stream.open("test.dat", std::ios::binary | std::ios::trunc)
    
    // To write I use :
    stream.write(reinterpret_cast<char*>(&x), sizeof(x));
    
  2. 手动缓冲:

    // Initialization
    const unsigned int length = 8192;
    char buffer[length];
    std::ofstream stream("test.dat", std::ios::binary | std::ios::trunc);
    
    // Then I put manually the data in the buffer
    
    // To write I use :
    stream.write(buffer, length);
    

我期待同样的结果...

但是我的手动缓冲在写入 100MB 的文件时将性能提高了 10 倍,并且 fstream 缓冲与正常情况相比没有任何改变(无需重新定义缓冲区)。

有人对这种情况有解释吗?

EDIT : Here are the news : a benchmark just done on a supercomputer (linux 64-bit architecture, lasts intel Xeon 8-core, Lustre filesystem and ... hopefully well configured compilers) benchmark (and I don't explain the reason of the "resonance" for a 1kB manual buffer...)

EDIT 2 : And the resonance at 1024 B (if someone has an idea about that, I'm interested) : enter image description here


这主要是由于函数调用开销和间接性造成的。 ofstream::write() 方法继承自ostream。该函数未内联到 libstdc++ 中,这是开销的第一个来源。然后ostream::write()必须调用rdbuf()->sputn()来进行实际的写入,这是一个虚函数调用。

最重要的是,libstdc++ 将 sputn() 重定向到另一个虚拟函数 xsputn(),这添加了另一个虚拟函数调用。

如果您自己将字符放入缓冲区,则可以避免这种开销。

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

std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)? 的相关文章

  • asp.net 文本框文本模式数字,仅允许数字

    我只是想知道 ASP NET 中是否有一种方法只允许文本框中的数字textmode number 当我使用这个时
  • 迭代变量并查找特定类型实例的技术

    我想迭代进程中内存中的变量 通过插件动态加载 并查找特定类型的实例 以前我可以找到特定类型 或内存中的所有类型 我可以创建类型的实例 我可以获取作为不同类型的字段包含的实例 但我无论如何都不知道只是 搜索 特定类型的实例 一种方法是使用 W
  • 如何创建可以像 UserControl 一样编辑的 TabPage 子类?

    我想创建一个包含一些控件的 TabPage 子类 并且我想通过设计器来控制这些控件的布局和属性 但是 如果我在设计器中打开子类 我将无法像在 UserControl 上那样定位它们 我不想创建一个带有 UserControl 实例的 Tab
  • 32 位应用程序的特征最大矩阵大小

    所以 我正在寻找Eigen http eigen tuxfamily org index php title Main Page当我尝试声明大于 10000x10000 的矩阵时 包崩溃 我需要声明一个像这样的矩阵 可靠地大约有 13000
  • C++:重写已弃用的虚拟方法时出现弃用警告

    我有一个纯虚拟类 它有一个纯虚拟方法 应该是const 但不幸的是不是 该接口位于库中 并且该类由单独项目中的其他几个类继承 我正在尝试使用这个方法const不会破坏兼容性 至少在一段时间内 但我找不到在非常量方法重载时产生警告的方法 以下
  • C# 中的接口继承

    我试图解决我在编写应用程序时遇到的相当大的 对我来说 问题 请看这个 为了简单起见 我将尝试缩短代码 我有一个名为的根接口IRepository
  • 如何配置 WebService 返回 ArrayList 而不是 Array?

    我有一个在 jax ws 上实现的 java Web 服务 此 Web 服务返回用户的通用列表 它运行得很好 Stateless name AdminToolSessionEJB RemoteBinding jndiBinding Admi
  • 如何从 C# 控制器重定向到外部 url

    我使用 C 控制器作为网络服务 在其中我想将用户重定向到外部网址 我该怎么做 Tried System Web HttpContext Current Response Redirect 但没有成功 使用控制器的重定向 http msdn
  • ASP MVC:服务应该返回 IQueryable 的吗?

    你怎么认为 你的 DAO 应该返回一个 IQueryable 以便在你的控制器中使用它吗 不 您的控制器根本不应该处理任何复杂的逻辑 保持苗条身材 模型 而不是 DAO 应该将控制器返回给视图所需的所有内容 我认为在控制器类中看到查询 甚至
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • 即使手动设置显示环境变量后,WSL Ubuntu 也会显示“错误:无法打开显示”

    我在 WSL Ubuntu 上使用 g 我使用 git 克隆了 GLFW 存储库 使用了ccmake命令配置并生成二进制文件 然后使用make在 build 目录中最终创建 a文件 我安装了所有OpenGL相关的库 usr ld 我不记得我
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 将数据打印到文件

    我已经超载了 lt lt 运算符 使其写入文件并写入控制台 我已经为同一个函数创建了 8 个线程 并且我想输出 hello hi 如果我在无限循环中运行这个线程例程 文件中的o p是 hello hi hello hi hello hi e
  • 无法将类型“System.IO.Stream”隐式转换为“Java.IO.InputStream”

    我提到了一些类似的问题 但没有一个涉及IO 当我使用时 我在java中使用了相同的代码Eclipse 那次就成功了 但现在我尝试在中使用这段代码Mono for Android C 它不起作用 我正在尝试运行此代码来创建一个InputStr
  • 通过 NHibernate 进行查询,无需 N+1 - 包含示例

    我有一个 N 1 问题 我不知道如何解决它 可以在这个问题的底部找到完全可重复的样本 因此 如果您愿意 请创建数据库 设置 NUnit 测试和所有附带的类 并尝试在本地消除 N 1 这是我遇到的真实问题的匿名版本 众所周知 这段代码对于帮助
  • 当“int”处于最大值并使用 postfix ++ 进行测试时,代码定义良好吗?

    示例 未定义行为的一个示例是整数溢出的行为 C11dr 3 4 3 3 int溢出是未定义的行为 但这是否适用于存在循环的以下内容 并且不使用现在超出范围的副作用i 特别是 这是否后缀增量规格帮助 结果的值计算在副作用之前排序 更新操作数的
  • 在类的所有方法之前运行一个方法

    在 C 3 或 4 中可以做到这一点吗 也许有一些反思 class Magic RunBeforeAll public void BaseMethod runs BaseMethod before being executed public
  • 当前的 x86 架构是否支持非临时加载(来自“正常”内存)?

    我知道有关此主题的多个问题 但是 我没有看到任何明确的答案或任何基准测量 因此 我创建了一个处理两个整数数组的简单程序 第一个数组a非常大 64 MB 第二个数组b很小 无法放入 L1 缓存 程序迭代a并将其元素添加到相应的元素中b在模块化
  • 剪贴板在 .NET 3.5 和 4 中的行为有所不同,但为什么呢?

    我们最近将一个非常大的项目从 NET Framework 3 5 升级到 4 最初一切似乎都工作正常 但现在复制粘贴操作开始出现错误 我已经成功制作了一个小型的可复制应用程序 它显示了 NET 3 5 和 4 中的不同行为 我还找到了一种解
  • 带重定向标准流的 C# + telnet 进程立即退出

    我正在尝试用 C 做一个 脚本化 telnet 项目 有点类似于Tcl期望 http expect nist gov 我需要为其启动 telnet 进程并重定向 和处理 其 stdin stdout 流 问题是 生成的 telnet 进程在

随机推荐

  • pandas 应用正则表达式来替换值

    我已将一些定价数据读取到 pandas 数据框中 这些值显示为 40 000 40000 conditions attached 我想将其精简为数值 我知道我可以循环并应用正则表达式 0 9 每个字段然后将结果列表重新连接在一起 但是有没有
  • 使用 Itext 替换 PDF 文件中的字符串,但字母 X 不替换

    我正在尝试替换的内容PDF在一篇文本中 但字母 X 未被替换 public static void main String args String DEST home diego Documentos teste pdf try PdfRe
  • jpa hibernate复合外键映射

    我在为某些实体设置 jpa 映射时遇到问题 我有一个如下定义的父实体 Entity Table name EIF INSTANCE HDR public class InstanceEntity implements Serializabl
  • 从另一个文件覆盖 JS 函数

    我试图重写 Bigcartel 的 JS 函数 我无法访问 JS 文件 原文是 updateCart function cart aside cart count main header cart htmlHighlight cart it
  • DevArt 的 dotConnect for Oracle 与 DataDirect 的 ADO.NET 数据提供程序

    有没有人对 DevArt 的 dotConnect for Oracle 和来自 DataDirect 的 ADO NET 数据提供程序 我们正在考虑将这些框架中提供的实体框架支持用于关键企业应用程序 我读过的一些文章提出了以下建议 Dev
  • 如何使用 javascript 将值从一个 html 页面传递到另一个 html 页面

    在第一页中 我在文本框中获取值 我需要将其传递到另一个页面 该页面分为 2 个框架 我需要在第一帧的 html 页面中显示该值 请给我一个简单的例子 我尝试过 window document getElementById inputbox1
  • 在 .Net Framework 的 Git 操作中运行 Nunit 测试

    我正在使用 NUnit Framework 来测试我的 NET Framework 项目 我想通过 GitHub Actions 运行我的测试 yml 文件 build runs on windows latest steps uses a
  • 如何使项目符号直接出现在 python 的 reportlab 包中缩进列表的文本旁边?

    我正在使用reportlab 2 6 的ListFlowable 来制作带有彩色圆圈项目符号的项目符号列表 但是 我希望项目符号显示在文本旁边 而不是与前面的非缩进文本对齐 我尝试打开 ListFlowable 源代码 但在那里找不到太多内
  • 无需开发者帐户的 Apple 推送通知

    我知道 需要注册Apple开发者帐户才能使用推送通知吗 对于已经拥有开发人员的其他人来说可能吗 为我生成证书的帐户 还是受到 Apple 限制 据我所知 还没有 我开发移动应用程序已经五年了 即使您使用的是 Firebase Cloud M
  • 将参数传递给 angularjs 过滤器

    是否可以将参数传递给过滤器函数 以便可以按任何名称进行过滤 就像是 scope weDontLike function item name console log arguments return item name name 实际上还有另
  • 使用 Ajax 和 jQuery 检查文件是否存在 - 始终返回 200 响应

    所以我需要在向客户端显示特定数据之前检查文件是否存在 使用 jQuery 我有这个 当我尝试运行该函数时 其中 example com 是我的域名 我总是收到 200 响应代码 我想知道
  • Django、Virtualenv、nginx + uwsgi导入模块wsgi报错

    我尝试使用 nginx virtualenv 和 uwsgi 在临时服务器上设置我的 django 项目 但我不断收到导入模块 wsgi 错误 如果有一个社区我可以在这里找到答案 提前谢谢大家 这是我的配置文件 我的 django 项目上的
  • 如何在SSIS包中参数化数据库连接字符串?

    我有一个在 Business Intelligence Development Studio 中构建的 SSIS 包 其中指定了源数据库和目标数据库 现在我想使用一些变量来参数化数据库连接并在命令行中运行包 我尝试用变量 User Sour
  • 模拟和网络凭据

    我需要通过一个NetworkCredential对象 其中包含当前模拟的用户从 ASP NET 应用程序访问 Web 服务的凭据 我的代码如下所示 WindowsIdentity windowsIdentity HttpContext Cu
  • Git - 暂时保存当前工作

    我正在 master 分支上添加一个功能 更改几个文件后 我意识到我需要在没有更改的情况下检查输出 我能想到的办法是 提交当前更改 签出并切换到新分支 在新分支中 git reset hard HEAD 这样我就可以回到原来的代码了 尝试代
  • 以步进增量滚动水平 UIScrollView?

    我有一个可以水平滚动的 UIScrollView 可滚动的内容按列显示 有没有办法使滚动仅以步进增量而不是像素移动 即一次移动一列 Diagram 是的 有 yourScrollView pagingEnabled YES 检查UI滚动视图
  • Python3 以网络摄像头 fps 处理并显示网络摄像头流

    如何读取相机并以相机帧速率显示图像 我想连续从网络摄像头读取图像 进行一些快速预处理 然后在窗口中显示图像 这应该以我的网络摄像头提供的帧速率 29 fps 运行 OpenCV GUI 和 Tkinter GUI 似乎太慢 无法以这样的帧速
  • MVC 使用 Html.CheckBoxFor 和 nullable Bool

    我有一个复选框 我想在与称为公共的字段相关的视图上显示该复选框 该复选框基本上说明特定行是否是公共的 在数据库中 这是一个位字段 但由于表以前的工作方式 它允许为空 我正在使用 Html CheckBoxFor 但它抱怨这个字段 因为在系统
  • 如何查找 int 数组中元素的索引?

    如何在 Java 类型数组中找到某个值的索引int 我尝试使用Arrays binarySearch在我的未排序数组中 它有时只给出正确的答案 Integer array 1 2 3 4 5 6 Arrays asList array in
  • std::fstream 缓冲与手动缓冲(为什么手动缓冲有 10 倍增益)?

    我测试了两种写入配置 Fstream缓冲 Initialization const unsigned int length 8192 char buffer length std ofstream stream stream rdbuf g