实验二 同步与异步write的效率比较

上传人:mg****85 文档编号:34799853 上传时间:2018-03-01 格式:DOC 页数:5 大小:122.50KB
返回 下载 相关 举报
实验二 同步与异步write的效率比较_第1页
第1页 / 共5页
实验二 同步与异步write的效率比较_第2页
第2页 / 共5页
实验二 同步与异步write的效率比较_第3页
第3页 / 共5页
实验二 同步与异步write的效率比较_第4页
第4页 / 共5页
实验二 同步与异步write的效率比较_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《实验二 同步与异步write的效率比较》由会员分享,可在线阅读,更多相关《实验二 同步与异步write的效率比较(5页珍藏版)》请在金锄头文库上搜索。

1、 实验二 同步与异步 write 的效率比较 一、实验目的 掌握 unix 的文件 I/O 系统调用 二、要求 1、实验要求程序必须指定输出的文件名,而该文件是否按同步方式打开, 则是可以选择的。因此程序至少带一个,至多两个输入参数。程序默认从标准 输入 STDIN_FILENO 读取输入文件,可以利用 shell 的输入定向功能选择具体 的输入文件。 2、系统调用 times()的说明 #include clock_t times(struct tms *buf); struct tms clock_t tms_utime; /* 记录进程除系统调用外所使用的 CPU 时间 */clock_

2、t tms_stime; /* 记录进程的系统调用所使用的 CPU 时间 */clock_t tms_cutime; /* 记录子进程除系统调用外所使用的 CPU 时间 */clock_t tms_cstime; /* 记录子进程的系统调用所使用的 CPU 时间 */ ; times 函数的返回值是进程迄今为止的存活时间。所有时间都是以“滴答” 为单位的,函数 sysconf(_SC_CLK_TCK)可获得所运行系统每秒的滴答数( 可 参考课本 P33)。三、设计和实现的主要原理、构思、算法、执行过程 1、将打开的文件的 BUFFSIZE 大小的块读入缓冲区,循环执行到全部读 完,在每次读的过

3、程中调用 write 进行写操作。 2、在每次写之前调用时间函数测量一次时间,之后再调用一次时间函数测 量时间,两次时间差就是 write 的写时间,将其记录就得到了 write 写整个文件 的时间。 3、每次将 BUFFSIZE 增大两倍,调用 lseek 函数使文件偏移量在整体读完 一次后返回文件头。四、具体的程序如下 #include “apue.h“ #include #include #include #include #includeint main(int argc,char *argv) int length,n,dida,size,i,fout,loop;char *buff

4、;clock_t cstart,cend;struct tms sstart,send;float utime,stime,ctime;if(argc!=2exit(-1);if(argc=2) / 当有两个参数的时候,即异步执行时if(fout=open(argv1,O_RDWR | O_CREAT|O_TRUNC,FILE_MODE)0)printf(“openerror!n“);exit(1);else if(argc=3)/当有三个参数,即同步执行时if(strcmp(argv2,“sync“)!=0) / 输入非法,第二个参数不是 syncprintf(“inputerror!n“)

5、;exit(1);else if(fout=open(argv1,O_RDWR |O_CREAT |O_SYNC|O_TRUNC,FILE_MODE)0)printf(“openerror!n“);exit(1); if(length=lseek(STDIN_FILENO,0,SEEK_END)0) / 用 lseek 计算文件的长度printf(“Lseek error!n“);if(lseek(STDIN_FILENO,0,SEEK_SET)=-1) / 定位到输入文件的开头printf(“Lseekerror!n“);printf(“nThe length of file is :%dn

6、“,length);if(buff=(char *)malloc(sizeof(char)*length)=NULL) /分配给 buff 长度为输入文件 长度的字节printf(“Malloc errorn“); /分配不成功返回exit(1); if(read(STDIN_FILENO,buff,length)0) /将输入文件读入到 buff 中printf(“Read errorn“);exit(1); printf(“BUFFSIZEtUSERttSYSTEMttCLOCKttLOOPn“);for(size=1024;size=131072;size*=2) / 分配给不同的 bu

7、ff 不同的长度lseek(fout,0,SEEK_SET); /重新将文件定位到开头cstart=times(n=length/size;loop=0; /loop 为计算循环的次数for(i=1;i=n;i+,loop+)if( write(fout,buff+(i-1)*size, size)!=size) / 按照不同的 size 将 buff 读 入到输/出文件中err_sys(“errorwrite!n“);if(write(fout,buff+n*size, length%size)!=length%size) /文件的长度不是 size 的整数/倍时将剩余的输出到文件中err_

8、sys(“errorawrite!n“);loop+; cend=times(dida=sysconf(_SC_CLK_TCK); ctime=(float)(cend-cstart);/clock utime=(float)(send.tms_utime -sstart.tms_utime); /usertimestime=(float)(send.tms_stime -sstart.tms_stime); /system timeprintf(“%ldtt%.2ftt%.2ftt%.2ftt%dn“,size,utime/dida,stime/dida,ctime/dida,loop);

9、printf(“n“); (1)计算 write 耗费的时间 为了准确计算 write 耗费的时间,很重要的就是要避免将 read 的时间计入, 因为 I/O 操作的时间通常是毫秒级的,不可以忽略。一种有效的方法是,设置 一个与输入文件长度相同的缓冲区,一次性地将输入文件读入缓冲区,而后就 不必再读输入文件。这样就可以有效避免计入 read 的时间。 (2)设置输入缓冲区时需要知道输入文件的长度。 除了使用系统调用 stat 外,更简单的方法是利用 lseek 的返回值来获取文 件的长度。 (3)在对每个给定大小的输出缓冲区计算写文件时间时,应当在开始写之前调 用 times(),记录下开始时

10、间,然后在整个输入缓冲区都复制到输出文件之后, 再调用 times(),两次调用 times()的时间间隔,就是在这个给定大小的输出缓 冲区的限制下,复制整个输入文件所耗费的写时间。至于在每一次写的时候所 执行的其他语句,它们相较于 I/O 操作,所花费的时间极小,可以忽略不计。五、实验结果 输入 gcc two.c error2e.c -o two 进行编译。再输入./two 1.bmp 4和./two apue.h 4 输出。下面是同步执行和异步执行的区别 6、体会建议 通过本次实验,我们亲自体会到了异步write 相比同步write 来说要快很多, 而且图片是一个很大的文件。从程序代码中看到程序很大一部分都在处理一些 打开、定位、读入、分配空间可能造成的错误,而真正体现功能的就是最后一 小段,体现了作为程序员所需要的严谨。同时通过这个实验还认识到了 times() 函数和 sysconf(_SC_CLK_TCK)函数的作用。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号