这节本想直接介绍I/O优化的,后来思考一下有必要对常用的I/O操作函数的特点介绍一下,这样要好些。下面就先介绍和I/O有关的库函数(以C99为准)

不同的操作系统有不同的文件管理方式,现行的主要有FAT(fileallocation table)、FAT32、NTFS(new technoly file system)、NWFS(netware file system)以及UFS(unix file system)当然还有一些分布式文件管理系统如:AFS(andrew filesystem)、DFS、Micorsoft DFS和NFS(net file system),这些文件系统的安全机制和属性都有着区别,所以当你做I/O优化时,要关注一下你所用的文件系统类型。

第一:对于一些格式化输入输出函数要注意检查format的类型是否匹配如fprintf(),printf(), sprintf(), snprintf(), vfprintf(), vprintf(), vsprintf()和vsnprintf()等。

第二:remove(),rename(),fopen(),freopen()这几个函数使用时要注意两点:a,要指定文件名和操作属性;b,这些操作可以改变文件属性,有的改动是不可逆的,一定要小心。如fopen的时候,remove就不能使用。多路并发的时候尤其要注意。关于多线程/多进程的风险控制,后面会有详细介绍,这里提到一下。

第三:文件路径推荐标准化处理,另外根据要求,选择相对路径和绝对路径。有很多公司都有封装好的canonicalize path name module,如果你是新人,问一下老员工。千万别等到软件发布时,才发现路径有问题。

第四:fopen使用的时候,要知道你是要创建一个文件还是打开一个已经存在的。有些人为了避免混淆,在fopen做了一层封装(wrapper),如创建文件用creat_file封装fopen的创建文件功能,对我自己而言,我不太喜欢用这种wrapper。当然这是个人习惯。总之你要知道自己的目的。

第五:文件操作函数,如果有返回值的一定要检查返回值,确定文件操作结果是你想要的。

使用error_no解析文件操作结果时,多线程时要注意控制粒度。具体解决方案,可以参考任何一本多线程书籍。或多或少都有提及怎么安全使用error_no。

第六:用fseek()替换rewind(),原因很简单rewind没有返回值,无法做安全性检查。fseek(stream, 0L, SEEK_SET)在功能上和rewind一样。

第七:remove,rename操作的时候,确定文件的状态是否是open。

第八:当代码对数据完整性有要求时,请用fflush()刷新缓冲区。

第九:用setvbuf代替setbuf ,同样理由是前者可以做安全性检查setbuf(stream, buf)==setvbuf(stream, buf, _IOFBF, BUFSIZ) or setvbuf(stream, buf, _IONBF, BUFSIZ)

第十:了解text mode和binary mode的区别。这两种模式下使用fseek和ungetc的方式是不同的。希望读者自己总结

第十一:习惯用foef和ferror来检查文件结尾和文件操作错误

第十二:getc()和putc()是宏,所以有边际效应。如char *file_name;

FILE *fptr;

/*Initialize file_name */

int c = getc(fptr = fopen(file_name,"r"));

if (c == EOF) {

  /*Handle error */

}

//文件被打开了两次。。所以会出错。应该这样写:

int c;

char *file_name;

FILE *fptr;

/*Initialize file_name */

fptr= fopen(file_name, "r");

if (fptr == NULL) {

  /*Handle error */

}

c= getc(fptr);

if (c == EOF) {

  /*Handle error */

}

第十三:最后再强调一下,文件打开要关闭,返回类型要做安全检查。

关于C++流操作的话题,将会在后面的内容介绍,这里只介绍C的,也欢迎大家补充这方面的内容

c/c++性能优化--I/O优化(上)的更多相关文章

  1. Web性能优化:图片优化

    程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...

  2. Web前端性能优化之图片优化

    我自己的Blog:http://blog.cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到了互联网内容总量的62%,也就是说超过 ...

  3. 【转】Android性能优化之布局优化篇

     转自:http://blog.csdn.net/feiduclear_up/article/details/46670433 Android性能优化之布局优化篇 分类: andorid 开发2015 ...

  4. MySQL 数据库性能优化之索引优化

    接着上一篇 MySQL 数据库性能优化之表结构,这是 MySQL数据库性能优化专题 系列的第三篇文章:MySQL 数据库性能优化之索引优化 大家都知道索引对于数据访问的性能有非常关键的作用,都知道索引 ...

  5. Android 性能优化 三 布局优化ViewStub标签的使用

    小黑与小白的故事,通过虚拟这两个人物进行一问一答的形式来共同学习ViewStub的使用 小白:Hi,小黑,ViewStub是什么?听说能够用来进行布局优化. 小黑:ViewStub 是一个隐藏的,不占 ...

  6. 如何优化运行在webkit上的web app

    如何优化运行在webkit上的web app 近来公司有个web app 项目运行在移动版android系统上,发现在电脑上跑的很流畅的web页面在移动版webkit上非常不流畅.根本无法和nativ ...

  7. Android性能优化之启动速度优化

    Android性能优化之启动速度优化   Android app 启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建 app 项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化 ...

  8. Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载)

    Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构(源码可下载) 说明:Java开源生鲜电商平台-性能优化以及服务器优化的设计与架构,我采用以下三种维度来讲解 1.  代码层面. 2.  数 ...

  9. Web 性能优化: 图片优化让网站大小减少 62%

    摘要: 压缩各种格式的图片. 原文:Web 性能优化: 图片优化让网站大小减少 62% 作者:前端小智 Fundebug经授权转载,版权归原作者所有. 这是 Web 性能优化的第二篇,上一篇在下面看点 ...

  10. web前端除了关注代码功能实现,还应具备web性能优化以及SEO优化的常识

    web前端除了关注代码功能实现,还应具备web性能优化以及SEO优化的常识 ——不会WPO.SEO的前端工程师不是好码农 作为一名web前端工程师,除了要实现上级的要求,满足其所需要的功能,还要在平时 ...

随机推荐

  1. javascirpt怎样模仿块级作用域(js高程笔记)

    因为javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包括函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i= ...

  2. Spring之SpringMVC的Controller(源码)分析

    说明: 例子就不举了,还是直接进入主题,本文主要是以SpringMVC的Controller接口为入点,来分析SpringMVC中C的具体实现和处理过程. 1.Controller接口 public ...

  3. QT最简单的程序执行过程分析(内含C++基础知识)

    打开QT Creator,新建一个“应用程序-Qt Widgets Application”项目: 输入名称scdc之后点击下一步. 在“构建套件”这个页面中直接点出下一步,然后再输入自己的类名Dat ...

  4. LeetCode之Reverse Words in a String

    1.(原文)问题描述 Given an input string, reverse the string word by word. For example, Given s = "the ...

  5. WebService它CXF这三个音符(Service接口实现类)

    ITeacherServiceImpl.java: /** * @Title:ITeacherServiceImpl.java * @Package:com.you.service.impl * @D ...

  6. QQ三方登录步骤详解

    首先,登录QQ互联:http://connect.qq.com/intro/login  ,注册成为开发者 选择申请加入,并创建你的应用. 创建成功后可以获取到appid和appkey 在网站的主页引 ...

  7. Asp.Net MVC 上传图片到数据库

    [读书笔记]Asp.Net MVC 上传图片到数据库(会的绕行)   之前上传图片的做法都是上传到服务器上的文件夹中,再将url保存到数据库.其实在MVC中将图片上传到数据库很便捷的事情,而且不用去存 ...

  8. html+js+ashx+easyui+ado.net权限管理系统

    分享一个html+js+ashx+easyui+ado.net权限管理系统   EasyUI.权限管理 这是个都快被搞烂了的组合,但是easyui的确好用,权限管理在项目中的确实用.一直以来博客园里也 ...

  9. Linux系统编程:客户端-服务器用FIFO进行通信

    先放下代码  回来在解释 头文件: clientinfo.h struct CLIENTINFO{ ]; int leftarg; int rightarg; char op; }; typedef ...

  10. 用NPOI实现导入导出csv、xls、xlsx数据功能

    用NPOI实现导入导出csv.xls.xlsx数据功能   直接上代码 首先定义一个接口   如果需要直接操作文件的话,就自己在封装一次 然后定义csv类的具体实现 这个需要引入命名空间LumenWo ...