这节本想直接介绍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. ApacheBench(ab)使用简介

    网站性能压力测试是服务器网站性能调优过程中必不可缺少的一环.只有让服务器处在高压情况下,才能真正体现出软件.硬件等各种设置不当所暴露出的问题. 性能测试工具目前最常见的有以下几种:ab.http_lo ...

  2. Appium Android Bootstrap源码分析之命令解析执行

    通过上一篇文章<Appium Android Bootstrap源码分析之控件AndroidElement>我们知道了Appium从pc端发送过来的命令如果是控件相关的话,最终目标控件在b ...

  3. angular实例

    angular实例教程(用来熟悉指令和过滤器的编写) angular的插件太少了,  所以很多指令和过滤器都要自己写,  所以对指令传进来的参数, 以及angular编译的流程更加熟悉才行写出好的插件 ...

  4. 出现Deprecated: Function ereg_replace() is deprecated in 的原因及解决方法

    在 php5.3环境下运行oscommerce,常常会出现Deprecated: Function ereg() is deprecated in...和Deprecated: Function er ...

  5. GRIDDATA(表格)第二版

    JQUERY 插件开发——GRIDDATA(表格)第二版 开发背景 表格插件之前我也写个一篇,当时写那个插件的时候,我自己还没有总结出写插件的方法,虽然功能实现了,但是使用起来还是有点别扭的,并且需要 ...

  6. Spring源深和六系列 CreateBean过程

    blog宗旨:用图说话. 这一章的图讲述了createBean的过程.到这里spring容器就能够完毕IOC的整个过程,拿到我们须要的对象. 下一章我们接着来看一看AOP完毕的过程. 附:文件夹 Sp ...

  7. ASP.NET MVC进阶

    ASP.NET MVC进阶 一.ASP.NET MVC中的AJAX应用 首先,在ASP.NET MVC中使用自带的ajax功能,必须要导入2个js文件(顺序不能颠倒): ASP.NET MVC提供了2 ...

  8. DataUml Design 课程6-DataUML Design 1.1版本号正式宣布(支持PD数据模型)

    从DataUML Design正式宣布到现在两个月,因为最近忙,出版到现在为止1.1版本号.稍后我们将始终坚持以良好DataUML Design软件,我希望程序员有很多支持. 一.1.1新的和改进的版 ...

  9. .NET MVC4 实训记录之五(访问自定义资源文件)

    .Net平台下工作好几年了,资源文件么,大多数使用的是.resx文件.它是个好东西,很容易上手,工作效率高,性能稳定.使用.resx文件,会在编译期动态生成已文件名命名的静态类,因此它的访问速度当然是 ...

  10. 日期,为下拉列表添加日期,优化,目前本人博客上最优的解决方案,之前学习的通过判断得到平年闰年,而这个是让系统自动去判断,无须if判断,代码示例

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...