⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.c

📁 unix环境下同步与异步write的效率比较
💻 C
字号:
#include "apue.h"
#include <sys/times.h>
#include <malloc.h>
#include <fcntl.h>
#include<string.h>
#include<stdio.h>

int main(int argc,char *argv[])
{
	int len,n,k,size,i,fd,loop;
	char *buff; 
	clock_t   start,end;
	struct  tms  tmsstart,tmsend;
	float     utime,stime,ctime;
	if(argc==2)//当有两个参数的时候,即异步执行时 
	{
		if((fd=open(argv[1],O_RDWR | O_CREAT|O_TRUNC,FILE_MODE))<0)//以只写方式打开文件,若没则创建该文件,若存在则打开并将其长度截短为0
		{
			err_sys("open error!!!\n");
		}
	}
	else if(argc==3)//当有三个参数,即同步执行时 
	{
        if(strcmp(argv[2],"sync")!=0)//输入非法,第二个参数不是sync 
		{
			err_sys("input error!!!\n");
		}
		else if((fd=open(argv[1],O_RDWR |O_CREAT |O_SYNC|O_TRUNC,FILE_MODE)) <0)//以只写方式打开文件,若没则创建该文件,若存在则打开并将其长度截短为0,使每次write都等到物理I/O操作完成
		{
			err_sys("open error!!!\n");
		}                                                         
	}
	else     //输入错误
	{
		err_sys("input error!\n");
	}
	if((len=lseek(STDIN_FILENO,0,SEEK_END))<0)//获取输入文件的长度
	{
		err_sys("Lseek error!\n");
	}
	if(lseek(STDIN_FILENO,0,SEEK_SET)==-1)//定位到输入文件的开头 
	{
		err_sys("Lseek error!\n");
	}
	printf("\nThe length of file is :%d\n",len);
	if((buff=(char *)malloc(sizeof(char)*len))==NULL)//开辟一个与输入文件长度相同的缓冲区
	{
		err_sys("malloc   error\n");//分配不成功返回 
	}  
	if(read(STDIN_FILENO,buff,len)<0)//把输入文件的内容读到缓冲区里
	{
        err_sys("Read error\n");
	}   
	k=sysconf(_SC_CLK_TCK);   
	printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP\n");
	for(size=1024;size<=131072;size*=2)//分配给不同的buf不同的长度 
	{
		lseek(fd,0,SEEK_SET);  //将输出文件的写位置复位到输出文件的开头
		start=times(&tmsstart);//记录下开始时间
		n=len/size;
		loop=0;//计算循环的次数 
		for(i=1;i<=n;i++,loop++)
			if( write(fd,buff+(i-1)*size, size)!=size) //从buf里将size大小的内容写进输出文件里
				err_sys("error write!!!\n");
			
			if(write(fd,buff+n*size, len%size)!=len%size)//文件的长度不是size的整数倍时将剩余的输出到文件中 
				err_sys("error write!!!\n");
			loop++;                                  
			end=times(&tmsend); //记录下结束时间
			ctime=(float)(end-start)/k;//clock  
			utime=(float)(tmsend.tms_utime -tmsstart.tms_utime)/k;//用户CPU时间
			stime=(float)(tmsend.tms_stime -tmsstart.tms_stime)/k;  //系统调用CPU时间
			printf("%ld\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",size,utime,stime,ctime,loop);  
	}
	printf("\n");                
}      






⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -