프로젝트 #1 최종

15
고고 고고고 고고고고고 프프프프 #1 고고 고고고 고고고고 Merge_#2 고고고고고 고고고고고 고고고

Transcript of 프로젝트 #1 최종

Page 1: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1

고급 시스템 프로그램Merge_#2

국민대학교 전자공학부 이은총

Page 2: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1▶ 수정 사항 및 새롭게 시도한 것

1. 버퍼 사이즈 조정 -> setvbuf(file1, NULL, _IOFBF, BUFFER_SIZE); setvbuf(file2, NULL, _IOFBF, BUFFER_SIZE); setvbuf(fout, NULL, _IOFBF, BUFFER_SIZE); 를 통해

stream buffer size 를 제어 해 보았다 .

#define BUFFER_SIZE 1024 코드를 이용하여 1024, 256, 128 로 걸린 시간을 측정해 보았다 .

Page 3: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1

BUFFER_SIZE 를 256 으로 지정했을 때 걸린 시간

BUFFER_SIZE 를 128 로 지정했을 때 걸린 시간1024 로 지정했을 때도 큰 차이가 없는 결과를 얻었기 때문에 BUFFER_SIZE 는 1024 로 지정하였다 .

Page 4: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1▶ 수정 사항 및 새롭게 시도한 것

2. fgetc, fputs 대신 fread 와 fwrite 사용-> fread 를 사용하기 위해 fseek 함수와 ftell 함수를 이용하여 파일의 크기를 측정 .

Page 5: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1▶ 수정 사항 및 새롭게 시도한 것-> fread 로 파일을 읽어 올 버퍼의 메모리 할당을 배열을 이용하여 임의로 주려고 했으나 (malloc 함수보다 안정하고 더 빠른 속도를 얻을 수 있을 것 같았기 때문 ) 생각보다 파일의 메모리가 컸기 때문에 malloc 함수를 사용하여 메모리를 동적 할당 하였다 .

대신 if (buff1 == NULL){ fputs ("error, buff1_malloc\n", stderr); free(buff1); return 1; } 코드를 삽입하여 malloc 함수가 실패했을 경우에 대비하였다 .

Page 6: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1▶ 수정 사항 및 새롭게 시도한 것-> strtok_r 을 이용하여 fread 로 읽어온 파일을 파싱하였다 .

#define DELIM "\n“ 으로 단위를 설정 .

파싱 후에는 개행을 위해 fpuc(0x0a,fout) 를 삽입하였다 .

Page 7: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1▶ 수정 사항 및 새롭게 시도한 것

3. 문자열 뒤집기 함수-> 함수의 내용은 동일하나 기존의 merge 에서는 readaline_and_out 에서 문자열이 반전되는 내용을 처리하였으나이번에는 따로 함수를 만들어 호출하였다 .

Page 8: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1 ▶ 수정된 코드

<line 7~8>#define 을 사용하여 숫자로 대입했던 코드를 알아보기 쉽게 변환

Page 9: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1<line 38~41>Setvbuf 를 이용하여 stream buffer size 제어

<line 45>Readaline_and_out 함수 호출을 약간 수정했다 .

Page 10: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1<line 76~83>Fseek 함수를 이용하여 파일 포인터의 위치를 마지막으로 이동하고 ftell 함수를 이용하여 해당 위치에서의 파일의 바이트값을 반환함으로 , 파일의 크기를 알아내었다 .

마지막으로 Rewind 함수를 이용하여 파일 포인터의의 위치를 초기화 시켰다 .

<line 85~98>Malloc 을 이용하여 fread 로 읽어올 파일을 저장할 buff 의 메모리를 할당하였다 .

Page 11: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1<line 101~111>Fread 를 이용하여 파일 2 개를 각각 읽어왔다 .

<line 112~114>Strtok_r 을 이용하여 파일을 파싱하였다 .

<line 116~130>Fwrite 를 이용하여 reverse_str 함수로 반전된 문자열을 \n단위로 fout 에 저장한다 .Fputc 를 이용하여 개행하였다 .또 line 수를 읽어오기 위해 line 을 배열로 선언하여 함수 내에서 카운트 하도록 하였다 .

<line 132~133>Free 를 이용하여 할당 된 메모리를 해제 하였다 .

Page 12: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #1

<line 138~148>문자열 반전 함수

Page 13: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #11. merge_final.c 로 수행했을 때 걸린 시간 [sec]

평균 = 32.986980 sec

시행횟수 1 2 3 4 5시간[sec]

33.721643

33.383838

30.300226

34.786477

32.742719

Page 14: 프로젝트 #1 최종

고급 시스템 프로그래밍 프로젝트 #12. 이전의 코드 (merge_array.c) 로 수행했을 때 걸린 시간 [sec]

평균 = 64.748136 sec

3. 제공된 merge.c 로 수행했을 때 걸린 시간

시간 = 97.435656 sec

4. 최종 성능 = (32.986980/ 97.435656) = 기본 merge.c 속도의 0.3386 배

시행횟수 1 2 3 4 5시간[sec]

66.726868

62.765361

64.619779

67.094016

62.534654

Page 15: 프로젝트 #1 최종

읽어 주셔서 감사합니다 .

고급 시스템 프로그래밍 프로젝트 #1