- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在提供读取随机生成的输入文件并将读取的相同字符串回显到输出的相同程序之后。唯一的区别是,一方面我提供来自 linux 系统调用的读写方法,另一方面我使用 fread/fwrite。
用 10Mb 大小的输入为我的应用程序计时,并将其回显到/dev/null,并确保该文件未被缓存,我发现当使用非常小的缓冲区时,libc 的 fwrite 速度大大加快( 1 个字节以防万一)。
这是我使用 fwrite 时的输出:
real 0m0.948s
user 0m0.780s
sys 0m0.012s
并使用系统调用写入:
real 0m8.607s
user 0m0.972s
sys 0m7.624s
我能想到的唯一可能性是内部 libc 已经在缓冲我的输入...不幸的是我在网上找不到那么多信息,所以也许这里的专家可以帮助我。
最佳答案
Timing my application with an input of 10Mb in size and echoing it to /dev/null, and making sure the file in not cached, I've found that libc's frwite is faster by a LARGE scale when using very small buffers (1 byte in case).
fwrite
适用于缓冲的流。因此,许多小缓冲区会更快,因为它不会运行昂贵的系统调用,直到缓冲区填满(或者您刷新它或关闭流)。另一方面,发送到 write
的小缓冲区将对每个缓冲区 运行代价高昂的系统调用 - 这就是您失去速度的地方。对于 1024 字节的流缓冲区和写入 1 字节的缓冲区,您将看到每 千字节 有 1024 次 write
调用,而不是 1024 次 fwrite
调用变成一个write
- 看到区别了吗?
对于大缓冲区,差异会很小,因为缓冲会更少,因此 fwrite
和 write
之间的系统调用数量会更一致。
换句话说,fwrite(3)
只是一个库例程,它将输出收集到 block 中,然后调用 write(2)
。现在,write(2)
是一个系统调用,它陷入内核。这就是 I/O 实际发生的地方。简单地调用内核会有一些开销,然后实际编写一些东西需要时间。如果您使用大缓冲区,您会发现 write(2)
更快,因为无论如何最终都必须调用它,并且如果您每次 fwrite 写入一次或多次,那么 fwrite 缓冲开销只是那:更多的开销。
如果您想阅读更多相关信息,可以查看this document。 ,其中解释了标准 I/O 流。
关于c - 为什么 fwrite libc 函数比 syscall write 函数快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1360021/
我遇到一些 fwrite 问题,它以我不明白的方式失败。 在这段代码中,fwrite 都失败并给出 tmp = 0。 if ((file = fopen(filenameout, "wb")) !
好吧,事情是这样的……我记得上周创建了一个程序,要求我以二进制模式打开一个文件并向其中写入数据。首先,我尝试使用fopen函数,检查结果是否正确,然后尝试写入数据。我记得第一次尝试时,fwrite 操
早上好, 我正在尝试将以下结构的内容写入文件(更具体地说是 BMP 文件),并且想知道为什么 fwrite 的二进制输出ing 整个结构和 fwrite结构体的各个项目是不同的。这就是C的工作方式吗?
我在某个地方遇到了这个。 正在写入一个文件,然后rewind(fileptr) 完成,然后写入应该写入文件开头的内容。但是写在开头,不会覆盖文件的内容吗?请指教。 最佳答案 技术上,是 是的,文件将被
fwrite 一个整数取决于字节序,但是有没有一种方法可以将一个整数 0x00000004 写入一个文件,这样无论它运行在什么机器上,它都可以始终被读取为 0x00000004。 一个想法是始终按照特
我在 php 中编写一个函数,在客户端我有一个 Canvas 图像,我使用 toDataUrl() 和一个文件名将图像保存在服务器上。这是代码: 关键是这段代码有效。对于我在其上使用的三分之二的页面
当我运行这个小代码并在控制台上输入 3 个整数时,由于 fwrite 语句,它没有按应有的方式打印出来。只有在我连续按回车键一段时间后,它才会打印出来。帮助?P.S:学习速度比 scanf 和 pri
我的网站在 /var/www/html/hs/ ,我有我的更新.php .它应该写到/var/www/html/hs/json/myFile.json ,但事实并非如此。当我尝试写入 的同一目录时更新
这个函数应该获取一个参数作为文件的指针并将所有文件放入struct anagram ,然后将其写入另一个文件。现在每个数据之间都有很大的空间。 charCompare 工作正常,因为我制作了一个测试文
这是在我的网站上上传带有“var$”内容的“file.txt”的 URL: http://www.mywebsite.com/fwrite.php?stringData=var$&myFile=fil
如果字符串包含 ~,我似乎无法将其打印到标准输出。 > A = "/.git". > io:fwrite(A). /.gitok > B = "~/.git". > io:fwrite(B). **
我发现当我尝试写入一些大数据时 fwrite 失败,如下面的代码所示。 #include #include int main(int argc, char* argv[]) { int s
我正在写这个: $fh = fopen('public/newsletter.txt', 'w'); foreach($entries as $row) { fwrite($fh,
我又来了,这次有一个 PHP 问题...我正忙于制作某种管理面板(非常基本),但是当我试图像我的 slider 或其他东西一样进行更改时,fwrite 会覆盖所有内容。这是我的 PHP 代码: 0)
根据fwrite的手册页: fread() and fwrite() return the number of items successfully read or written (i.e., no
我只是想对一组数字进行排序(虽然我发布的代码不是我要使用的方法,但我确实需要将代码中的输出写入二进制文件). 一切正常,除了“ordenar”的最后一次迭代:当我在订购后再次打印回数字时,除了最后一行
我想使用 data.table::fwrite 以文本日志的形式快速存储和检索状态。这些是通过移动应用程序更新的,该应用程序使用管道工 API 调用到 R 端点。移动应用程序每秒可能会触发许多 API
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我正在尝试使用“fwrite”并制作 snd 文件。我想做 IIR 滤波器。我制作了一个 FIR 滤波器,并使用 IIR 滤波器的代码。(当然,改变系数)但我认为“fwrite”不起作用。因为IIR滤
我正在尝试将 wchar 数组写入 C 中的文件,但是存在某种损坏和不相关的数据,例如这样的变量和路径 c.:.\.p.r.o.g.r.a.m. .f.i.l.e.s.\.m.i.c.r.o.s.o.
我是一名优秀的程序员,十分优秀!