#include #include #include #include #include #include #define BLOCK_SIZE 512 static char buffd[0x80000]; /* Data Buffer */ char sfname[256]; /* Special Device or File name */ double r_rate, w_rate; unsigned long w_time, r_time; /* Write, Read Access time */ unsigned long limit; int wr_times, w_test_times, r_test_times; int bpa, end_bpa; void sp(); time_t ltime(); int main(argc,argv) int argc; char *argv[]; { int v, i; limit = 100; bpa = 2; end_bpa = 256; wr_times = 32768*8; /*argument check*/ if(argc <= 1) { fprintf(stderr, "usage : %s [option's]\n", argv[0]); fprintf(stderr, "option: -limit time : minimum testing time(sec)\n"); fprintf(stderr, " -capacity filesize : testing file size(MBytes)\n"); fprintf(stderr, " -from begining_blocksize : beginng block size(KBytes)\n"); fprintf(stderr, " -to end_blocksize : end block size(KBytes)\n"); exit(0); } /* Set Paramaters */ strcpy(sfname, argv[1]); strcat(sfname, "\0"); i = 2; if(argc > 2) { do { if(*(argv[i]) == '-') { switch(argv[i][1]) { case 'l': limit = (unsigned long)atol(argv[i+1]); i++; break; case 'c': wr_times = (unsigned long)atol(argv[i+1]) * 1024; if(bpa != 2) wr_times = (wr_times * 2 ) / bpa; i++; break; case 'f': bpa = atoi(argv[i+1]) * 2; wr_times = (wr_times * 2 ) / bpa; i++; break; case 't': end_bpa = atoi(argv[i+1]) * 2; i++; break; default: printf("illigal option\n"); exit(0); } } i++; }while(i < argc); } v = bpa * wr_times; i = 1; fprintf(stdout, "*-------------------**-------------------------------*-------------------------------*\n"); fprintf(stdout, "| Transfer size || Write | Read |\n"); fprintf(stdout, "* **---------------------------------------------------------------*\n"); fprintf(stdout, "| (File Size) || MB/s | Ave. sec (Times) | MB/s | Ave. sec (Times) |\n"); fprintf(stdout, "*-------------------**----------*--------------------*----------*--------------------*\n"); do{ sp(); r_rate = ((double )wr_times * 5120)/ ((double)r_time * 1048576) * bpa; w_rate = ((double )wr_times * 5120)/ ((double)w_time * 1048576) * bpa; fprintf(stdout, "| %3dKB (%3dMB) ||", (bpa * 512 /1024), (bpa * wr_times / 2048)); fprintf(stdout, " %4.1f | %5.1f (%4d) |", w_rate, (float )w_time/10, w_test_times); fprintf(stdout, " %4.1f | %5.1f (%4d) |\n", r_rate, (float )r_time/10, r_test_times); fprintf(stdout, "*-------------------**----------*--------------------*----------*--------------------*\n"); if(bpa <= 64) { bpa *= 2; wr_times /= 2; } else { bpa += 64; wr_times = v / bpa; } if(bpa == 256) { bpa = 248; wr_times = v / bpa; } i++; }while(bpa <= end_bpa); } void sp() { int fd; /*fildes*/ int Bytes; /*bytes per access*/ int i, j; /* work counter */ int tt;/*tolal time*/ time_t tloc0,tloc1;/* Access start, end time */ int tds; /* Total Data Size */ char WString[32]; Bytes = bpa * BLOCK_SIZE; tds = wr_times * Bytes; /* open file or special device */ if((fd=open(sfname,O_RDWR|O_CREAT,0666)) < 0){ fprintf(stderr, "Can not open Write/Read file\n"); exit(-1); } /* Write Speed Test */ tt = 0; j = 0; do { /*Seek*/ lseek(fd, 0L, 0); if(write(fd,buffd,Bytes) != Bytes) /*Physical Seek*/ { fprintf(stderr, "Write Error!!\n"); exit(-1); } /*Bench Start*/ ltime(&tloc0); /* Start time */ for( i = 0 ; i < wr_times ; i++) { if(write(fd,buffd,Bytes) != Bytes) { fprintf(stderr, "Write Error!!\n"); exit(-1); } } ltime(&tloc1); /* End time */ tt += tloc1 - tloc0; j++; }while(tt <=limit); w_test_times = j; w_time = (tt * 10)/ j; sprintf(WString, "write time: %3.1f(%d)", ((float )w_time / 10), j); /* Read Speed Test */ tt = 0; j = 0; do { /*Zero Seek*/ lseek(fd, 0L, 0); if(write(fd,buffd,Bytes) != Bytes)/*Physical Seek*/ { fprintf(stderr, "Write Error!!\n"); exit(-1); } /*Bench Start*/ ltime(&tloc0); /* Start time */ for( i = 0; i < wr_times; i++) { if(read(fd,buffd,Bytes) != Bytes) { fprintf(stderr, "Read Error !!\n"); exit(-1); } } ltime(&tloc1); /* End time */ tt += tloc1 - tloc0; j++; }while(tt <=limit); r_test_times = j; r_time = (tt * 10)/ j; //printf("\nread time: %3.1f(%d) | %s\n", ((float )r_time / 10), j, WString); } time_t ltime(tloc) time_t *tloc; { /*struct timeb tp;*/ /*ftime(&tp);*/ /* *tloc = (time_t)((unsigned long )tp.time * 1000) + (time_t)(tp.millitm);*/ time(tloc); return(*tloc); }