write 和 printf 哪个更快?

2024-01-12

进行以下测试后:

for( i = 0; i < 3000000; i++ ) {
    printf( "Test string\n" );
}

for( i = 0; i < 3000000; i++ ) {
    write( STDOUT_FILENO, "Test string\n", strlen( "Test string\n" ) );
}

事实证明,对 printf 的调用总共花费了 3 秒,而对 write 的调用则花费了高达 46 秒的时间。如何,通过所有花哨的格式化魔法printf确实如此,而且事实是printf本身调用write, 这可能吗?我缺少什么吗?

任何和所有的想法和意见都会受到赞赏。


鉴于 printf 本身调用 write 这一事实,这怎么可能?我缺少什么吗?

是的,你缺少一些东西。printf不一定会打电话write 每次。相当,printf缓冲其输出。也就是说,它经常将其结果存储在内存缓冲区中,仅调用write当缓冲区已满时,或在某些其他条件下。

write是一个相当昂贵的调用,比将数据复制到printf的缓冲区,因此减少了write调用提供了净性能胜利。

如果您的标准输出定向到终端设备,那么printf calls write每次它看到一个\n——就你而言,每次被调用时。如果您的标准输出定向到一个文件(或/dev/null), then printf仅当其内部缓冲区已满时才调用 write。

假设您正在重定向输出,并且printf的内部缓冲区是4Kbytes,然后第一个循环调用write3000000 / (4096 / 12) == 8780 次。然而,你的第二个循环调用write300万次。

除了减少呼叫次数的影响之外write, 是个size的来电write。硬盘驱动器中的存储量是一个扇区——通常为 512 字节。写入比扇区更少量的数据可能涉及读取扇区中的原始数据、修改它,并将结果写回。调用write然而,使用完整的扇区可能会更快,因为您不必读入原始数据。printf的缓冲区大小选择为典型扇区大小的倍数。这样系统就可以最有效地将数据写入磁盘。

我希望你的第一个循环比第二个循环快得多。

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

write 和 printf 哪个更快? 的相关文章

随机推荐

  • 如何正确删除保留实例Fragment

    目前 我想在配置更改期间保留昂贵的数据结构 我选择不使用Bundle来处理它 因为昂贵的数据结构不可分割 因此 我使用一个非 UI 片段 称为保留实例片段 以其setRetainInstance true 来保存数据结构 public cl
  • 线程“main”中的异常 java.util.InputMismatchException

    我需要有关 Java 的一项练习的帮助 我可能在这个错误上停留了 2 个小时 任何帮助都会很棒 Exception in thread main java util InputMismatchException at java util S
  • 计算函数的反函数--库[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有任何库可用于函数的反函数 更具体地说 给定一个函数y f x 和域 是否有任何库可以输出x f y
  • ORM 排序与模型“元”排序 - Django 1.11

    小问题 订购商品的更好方式是什么 1 class Table models Model class Meta ordering user 2 Table objects all order by user 我认为第二个更好 因为第一个总是会
  • iOS - AudioOutputUnitStop 导致应用程序冻结并发出警告

    有时执行 AudioOutputUnitStop inputUnit 导致应用程序冻结约 10 15 秒并显示以下控制台消息 WARNING 0x3b58918c AURemoteIO cpp 1225 Stop AURemoteIO St
  • 如何使用nodeJS连接到隐式FTPS服务器?

    对于一个项目 我必须通过隐式连接连接到 FTPS 服务器 我尝试使用node ftp 因为这似乎是唯一支持隐式连接的库 我使用以下代码进行连接 var ftpC new FTPClient ftpC on ready function co
  • angular2 组件中的多个动画触发器

    我想在一个组件中定义多个动画触发器 这可能吗 例如 一种用于进入场景 另一种用于悬停 或者我是否需要为这种情况定义两个组件 父子组件 项目组件 ts removed the import and class part for better
  • Javascript / REGEX:删除字符串中以特定字母开头的特定文本(单词),单词之间以空格分隔

    我知道这可以通过正则表达式快速完成 我得到的字符串如下 Alpha OmegaS Sheol Gehena GSSaga Serekali 我想删除以 s 开头的单词 所以我应该 Alpha OmegaS Gehena GSSaga 我尝试
  • ThreadStateException:尝试加入线程时线程尚未启动

    就在最近我面试的时候遇到了这样一个问题 methid 计算 执行的输出是什么 public void Calculate var threads Enumerable Range 0 50 Select x gt var thread ne
  • DataGridView 鼠标滚轮滚动停止工作

    我的应用程序中有一个 DataGridView 但无法使用鼠标滚轮滚动它 以前运行得很好 我不确定我做了什么导致了这个问题 因为我最近对代码进行了多次更改后才注意到它 我没有发布任何代码 因为有超过 2k 行 而且我不确定错误可能出在哪里
  • 如何阻止网站注册表中的一次性电子邮件地址? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想知道可能的阻止方法一次性电子邮件地址 http en wikipedia org wiki Dis
  • 是否可以对包含 url 编码的 url 进行 urlencode?

    我有一个网站 使用 Facebook Twitter 美味分享链接 它们包含您希望共享的网站的 url 编码 url 问题是我想通过 php 重定向页面发送 facebook twitter delicious url 在编码的 url 中
  • 在 VBA 中导入 UTF-8 文件

    我想在表中导入一个管道分隔文件 但该文件采用 UTF 8 格式 具有动态结构 我曾尝试使用 TransfertText 和 FSO 但只有 ADODB Stream 似乎可以很好地处理这种编码 但它只读取全文 如何每行读取这样的文件行以在现
  • 具有抽象方法的接口

    我遇到了一些由同事编写的 PHP 代码 它没有用于任何用途 基本上它是一个包含抽象方法的接口 然后我说这很愚蠢 并展示了坐在我旁边的另一位同事 我们笑了 但随后开始互相询问这是否可能 如果可能的话是否真的有用 显然这是不可能的 参见下面的示
  • module-info.java 不适用于 Java 9 中的 lombok

    我在将项目迁移到Java 9 更新 Java 9 后 我尝试运行项目 但遇到编译器错误 Error 6 1 java package javax annotation is not visible package javax annotat
  • 在 Windows 8 上安装 Docker 卷不起作用

    Context 我想在 Windows 8 上运行 Docker Compose 应用程序 我在 Ubuntu 16 04 下制作了它 它运行得很好 此 Docker Compose 运行 nginx php fpm 这两个容器使用卷 Fi
  • Git 预提交钩子配置

    我正在关注办公室指导 https pre commit com创建钩子并将其添加到预提交检查过程 我需要创建 3 个文件 pre commit config yaml pre commit hooks yaml theCheckFile s
  • ioexception:在java中写入文件时客户端不拥有所需的权限

    我搜索了很多类似的问题 但无法解决我的问题 我试图在文件中写入一些内容 这给了我错误 My code try File f new File file name f createNewFile System out println Hell
  • 无法使用 Sigma.js 显示任何图表

    我想在网络界面上可视化大型网络图 经过几天的搜索 我决定使用 Sigma js 因为它看起来很简单并且兼容 HTML5 问题是我无法显示 Sigma js 网页上的任何图形示例 即使我使用作者在 Sigma js 主页上拥有的最少代码也是如
  • write 和 printf 哪个更快?

    进行以下测试后 for i 0 i lt 3000000 i printf Test string n for i 0 i lt 3000000 i write STDOUT FILENO Test string n strlen Test