목표 :
표준 파일 I/O의 성능과 memory-mapped I/O의 성능을 비교한다.
memory-mapped I/O : 파일의 내용을 메모리에 사상하는 mmap()시스템 콜을 사용
표준 파일 I/O : read() 시스템 콜을 사용하여 비교한다.
방법 :
성능 비교를 하기 위해 파일 이름을 command line argument를 사용한다.
파일에서 출력 가능한 문자들과 공백 문자들의 수를 계산한다.
이를 위해 두 가지 함수 isprint()와 isspace()를 사용한다.
만약 해당 파일을 찾을 수 없을 때에는 에러메시지를 출력하고 종료한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 | #include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <unistd.h> #include <fcntl.h> #include <time.h> /* 프로그램 작성자 : americano@korea.ac.kr 개발 날짜 : 2012-12-03 */ int main( int argc, char **argv){ int fd; //파일 디스크립터 int len; //파일의 길이 int i; int printable = 0; //출력가능한 문자열 개수 int whitespace = 0; //공백 문자열 개수 int choice = 0; // mmap일 경우 1 , 표준파일일 경우 0 int chunk = 1024; //기본 chunk의 크기는 1024 //int flag = PROT_WRITE | PROT_READ; int flag = PROT_READ; char *char_mmap = "mmap" ; char *file = NULL; char *copy_file; char buffer[8192]; //버퍼의 최대 크기는 8192 struct stat sb; struct timeval start_time, end_time; if (argc == 3){ //argument's number if ( strcmp (argv[2], char_mmap)==0) //mmap일때 choice = 1; else //mmap가 아닐때 chunk = atoi (argv[2]); if (chunk>8192){ //버프크기를 초과할 시 프로그램종료 printf ( "size over\n" ); exit (0); } } gettimeofday(&start_time, NULL); switch (choice){ case 0: if ((fd = open(argv[1], O_RDONLY))<0){ //파일오픈 perror ( "File Open Error" ); exit (1); } while ((len = read(fd, buffer, chunk))>0){ //버퍼로 복사 for (i = 0; i< len; i++){ //문자열 개수 측정 if (isprint(*(buffer+i))) printable++; if ( isspace (*(buffer+i))) whitespace++; } } close(fd); printf ( "*Standard File I/O*\n" ); break ; case 1 : //if((fd = open(argv[1], O_RDWR | O_CREAT)) < 0){ //파일 오픈 if ((fd = open(argv[1], O_RDONLY))<0){ perror ( "File Open Error" ); exit (1); } if (fstat(fd, &sb) < 0){ //file's status perror ( "fstat error" ); exit (1); } len = sb.st_size; file = ( char *)mmap(0,len, flag, MAP_SHARED, fd, 0); //momory mapped file I/O for (i = 0; i<len; i++){ //문자열 개수 측정 if (isprint(*(file+i))) printable++; if ( isspace (*(file+i))) whitespace++; } if (munmap(file, len) == -1){ //memory free perror ( "munmaperror" ); exit (1); } printf ( "*Memory-mapped I/O*\n" ); close(fd); break ; } gettimeofday(&end_time, NULL); if (end_time.tv_usec <= start_time.tv_usec){ if (end_time.tv_usec == start_time.tv_usec && end_time.tv_sec == start_time.tv_sec); else { end_time.tv_sec--; end_time.tv_usec += 1000000; } } printf ( "%d Printable Characters\n" , printable); //결과출력 printf ( "%d Whitespace Characters\n" , whitespace); printf ( "time:%d.%06dsec\n" ,end_time.tv_sec - start_time.tv_sec, end_time.tv_usec - start_time.tv_usec); return 0; } |
'대학교시절' 카테고리의 다른 글
알고리즘 과제 #2 (인접한 노드 그래프 생성) (0) | 2015.09.28 |
---|---|
알고리즘 과제 #1 (이진 트리 높이 구하기) (0) | 2015.09.28 |
운영체제 과제 #2 (뮤텍스와 세마포어 사용하기) (1) | 2015.09.28 |
운영체제 과제 #1 (fork 와 exec 사용하기) (2) | 2015.09.27 |
PCM(Phase_Change Memory) (0) | 2015.09.27 |