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

📄 timewrite.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 length,n,dida,size,i,fout,loop;
   char *buff; 
   clock_t   cstart,cend;
   struct  tms  sstart,send;
   float     utime,stime,ctime;
   if(argc!=2&&argc!=3){
           printf("input error!!\n");
          exit(-1);
   }
   if(argc==2){//当有两个参数的时候,即异步执行时 
      if((fout=open(argv[1],O_RDWR | O_CREAT|O_TRUNC,FILE_MODE))<0){
                 printf("open error!!!\n");
                 exit(1);
                 }
  }
   else if(argc==3){//当有三个参数,即同步执行时 
        if(strcmp(argv[2],"sync")!=0){//输入非法,第二个参数不是sync 
              printf("input error!!!\n");
              exit(1);
       }
       else if((fout=open(argv[1],O_RDWR |O_CREAT |O_SYNC|O_TRUNC,FILE_MODE)) <0){
                 printf("open error!!!\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("Lseek error!\n");
        }
  printf("\nThe length of file is :%d\n",length);
   if((buff=(char *)malloc(sizeof(char)*length))==NULL){//分配给buff长度为输入文件长度的字节 
            printf("Malloc   error\n");//分配不成功返回 
            exit(1);
   }  
   if(read(STDIN_FILENO,buff,length)<0){//将输入文件读入到buff中 
        printf("Read error\n");
        exit(1);
   }      
   printf("BUFFSIZE\tUSER\t\tSYSTEM\t\tCLOCK\t\tLOOP\n");
   for(size=1024;size<=131072;size*=2){//分配给不同的buff不同的长度 
           lseek(fout,0,SEEK_SET);//重新将文件定位到开头 
           cstart=times(&sstart);
           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("error write!!!\n");
                       
         if(write(fout,buff+n*size, length%size)!=length%size)//文件的长度不是size的整数倍时将剩余的输出到文件中 
                       err_sys("errora write!!!\n");
         loop++;                                  
         cend=times(&send); 
         dida=sysconf(_SC_CLK_TCK);
         ctime=(float)(cend-cstart);//clock  
         utime=(float)(send.tms_utime -sstart.tms_utime);//usertime 
         stime=(float)(send.tms_stime -sstart.tms_stime); //system time 
         printf("%ld\t\t%.2f\t\t%.2f\t\t%.2f\t\t%d\n",size,utime/dida,stime/dida,ctime/dida,loop);  
     
   }
  printf("\n");                
}      
              
      
     
       
             
    

⌨️ 快捷键说明

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