APUE 学习笔记(四) 标准I/O库
1.流与FILE对象
2.缓冲
3.二进制I/O
float data[];
fwrite(&data[], sizeof(data[]), , fp);
(2)读或写一个结构体
struct {
short count;
long total;
char name[NAMESIZE];
} item;
fwrite(&item, sizeof(item), , fp);
4.测试I/O性能
#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h> #define BUFSIZE 1
//#define BUFSIZE 8
//#define BUFSIZE 64
//#define BUFSIZE 256
//#define BUFSIZE 1024
//#define BUFSIZE 4096
//#define BUFSIZE 9182 int main(int argc, char* argv[])
{
char buf[BUFSIZE];
int nbytes = ;
/* unix read version */
/*
while ((nbytes = read(STDIN_FILENO, buf, BUFSIZE)) > 0) {
if (write(STDOUT_FILENO, buf, nbytes) != nbytes) {
fprintf(stderr, "write error\n");
}
}
if (nbytes< 0) {
fprintf(stderr, "read error\n");
}
*/ /* std c I/O version */
int c;
while ((c = fgetc(stdin)) != EOF) {
if (fputc(c, stdout) == EOF) {
fprintf(stderr, "fputc error\n");
}
}
if (ferror(stdin)) {
fprintf(stderr, "fgetc error\n");
} return ;
}
我们查看程序的测试文本: stat test.txt
得知:该测试文件为 259,546,640Byte, I/O块大小为 4096字节
| BUFSIZE | 用户CPU时间 | 系统CPU时间 | 时钟时间 | 系统调用数 |
| 1 | 30.302 | 555.702 | 588.962 | 259,546,640 |
| 8 | 3.672 | 71.468 | 75.741 | 32,443,330 |
| 64 | 0.460 | 9.165 | 9.877 | 4,055,417 |
| 256 | 0.108 | 2.600 | 3.011 | 1,013,854 |
| 1024 | 0.052 | 1.020 | 1.889 | 253,464 |
| 0.016 | 0.512 | 1.649 | 63,366 | |
| 9182 | 0.000 | 0.596 | 1.735 | 31,683 |
| fgetc fputc | 7.604 | 0.380 | 8.001 |
从上表可以看出:
(1) BUFSIZE直接决定了 系统调用数,所以使用unix I/O的关键在于选取最合适的缓冲区长度
(2)当BUFSIZE等于 文件 I/O块大小时,系统CPU时间出现最小值,继续增加缓冲区长度对此时间几乎没有影响
(3)fgetc fputc标准I/O自行管理缓冲区,但是其时间都大于 unix I/O最佳缓冲区时的时间值,使用标准I/O库时,系统会自动选取一个最佳I/O长度
一般依据文件的I/O块大小值,但是因为标准I/O的内部缓冲 和 unix I/O最佳缓冲区长度相等时,标准I/O库中有一个 外存文件==> FILE内部缓冲 ==> 应用缓冲,
而Unix I/O 是直接 外存文件 ==> 应用缓冲, 两者虽然系统调用数相同,但是 标准I/O多了缓冲的操作,所以效率较低
APUE 学习笔记(四) 标准I/O库的更多相关文章
- muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制
目录 muduo网络库学习笔记(四) 通过eventfd实现的事件通知机制 eventfd的使用 eventfd系统函数 使用示例 EventLoop对eventfd的封装 工作时序 runInLoo ...
- 官网实例详解-目录和实例简介-keras学习笔记四
官网实例详解-目录和实例简介-keras学习笔记四 2018-06-11 10:36:18 wyx100 阅读数 4193更多 分类专栏: 人工智能 python 深度学习 keras 版权声明: ...
- APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause
转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...
- APUE学习笔记3_文件IO
APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...
- 零拷贝详解 Java NIO学习笔记四(零拷贝详解)
转 https://blog.csdn.net/u013096088/article/details/79122671 Java NIO学习笔记四(零拷贝详解) 2018年01月21日 20:20:5 ...
- Linux学习笔记(四) vi编辑器
一.vi 编辑器 vi 编辑器 (Visual Interface) 是所有 Unix 及 Linux 系统下标准的编辑器,相当于 Windows 系统中的记事本 它有三种模式,分别是: Comman ...
- go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)
目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...
- openresty 学习笔记四:连接mysql和进行相关操作
openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...
- C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻
前面三篇讲了MEF的基础和基本到导入导出方法,下面就是见证MEF真正魅力所在的时刻.如果没有看过前面的文章,请到我的博客首页查看. 前面我们都是在一个项目中写了一个类来测试的,但实际开发中,我们往往要 ...
随机推荐
- C++链表简单的应用
学生管理系统,输入学生的姓名和学号,然后再输出: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <stdlib ...
- QT+event() + 事件过滤器
其存在的意义: mywidget.h: #ifndef MYWIDGET_H #define MYWIDGET_H #include <QWidget> namespace Ui { cl ...
- Bootstrap 缩略图
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Java-basic-1
1. Java Standard Edition (Java SE) Java Enterprise Edition (Java EE): geared toward developing large ...
- Party Games UVA - 1610 贪心
题目:题目链接 思路:排序后处理到第一个不同的字符,贪心一下就可以了 AC代码: #include <iostream> #include <cstdio> #include ...
- 2018 Multi-University Training Contest 1 Balanced Sequence(贪心)
题意: t组测试数据,每组数据有 n 个只由 '(' 和 ')' 构成的括号串. 要求把这 n 个串排序然后组成一个大的括号串,使得能够匹配的括号数最多. 如()()答案能够匹配的括号数是 4,(() ...
- $ cat /usr/share/doc/wireshark-common/README.Debian
$ cat /usr/share/doc/wireshark-common/README.Debian I. Capturing packets with Wireshark/Tshark There ...
- MMM的一周计划 准备公告
(19.6.17——19.6.22) 目前本周还没有过去所以还会更新 第0周 目前博客更新暂定于 [题目难度颜色见洛谷] 1.绿题以上绝对更新 2.黄题可能更新 3.其他估计不会有更新 准备工作 1. ...
- luogu1742 最小圆覆盖
狗题卡我精度--sol #include <algorithm> #include <iostream> #include <cstdlib> #include & ...
- mantisbt邮件配置
PHP.INI里面 [mail function]; For Win32 only.#SMTP = 192.168.0.249SMTP = smtp.163.comsmtp_port = 25 ; F ...