adv system programing hw1 김정출

10
국국국국국 / 국국국국국국 / 20103318 국국국 2016 – 2 국국 국국국 국국국국국 merge.c

Upload: -

Post on 16-Apr-2017

86 views

Category:

Software


4 download

TRANSCRIPT

Page 1: adv system programing hw1 김정출

국민대학교 / 컴퓨터공학부 / 20103318 김정출

2016 – 2 고급 시스템 프로그래밍merge.c

Page 2: adv system programing hw1 김정출

1 과제목표2 성능측정3 성능 향상 시도4 성능 향상 실패 요인

Page 3: adv system programing hw1 김정출

3

01

1 과제목표

내용 요약• 두 ( 큰 ) 파일을 만들고 , 그 파일을 line-by-line 으로 reverse/

merge 하는• 성능이 좋은 프로그램 만들기상세 가이드• 성능 성능 = ( 최종 버전 실행 시간 ) / (Template 실행 시간 ) Raspberry PI 2 에서 성능 측정

• 실행시간 merge 프로그램이 두 file 을 reverse/merge 하여 두 배 크기의 file 을 만드는데

걸린 시간 측정하여 , 5 번 실행 평균

• 입력 파일 100 MB 의 text file (gen.c 로 만들어진 것 )

두 입력 파일의 각 라인을 string 을 reverse 하고 , 두 파일을 한 줄 씩 번갈아가면 쓴 file

과제 목표

Page 4: adv system programing hw1 김정출

4

02 성능 측정

1 성능 측정

내용 요약• 5 번 수행 시간의 측정• 평균 측정• 개선된 시간 측정

제공된 merge.c

수정한 코드 merge.c

구분 제공된 merge.c (A) 수정한 코드 merge.c (B)

1 번째 수행 시간 122.850540 sec 57.118719 sec

2 번째 수행 시간 132.483199 sec 58.543095 sec

3 번째 수행 시간 119.021513 sec 57.787764 sec

4 번째 수행 시간 122.913539 sec 57.601084 sec

5 번째 수행 시간 127.933568 58.807489 sec

평균 수행 시간 125.0404718 57.9716302 sec

A-B 67.0688416 sec

Page 5: adv system programing hw1 김정출

5

03

Perf 로 성능을 측정한다

perf record ./merge file_0001 file_0002 file_outperf report

성능 향상 시도 1 - perf 로 성능 측정하기

많은 오버헤드 (overhead) 를 가져온 것은 파일 쓰기인 fputc() 와 파일 읽기 fgetc() 에서 발생하였다 .

파일에 한 글자씩 출력하는 fputc 에서 한 라인을 출력하는 fputs() 로 변경하였다 .

Page 6: adv system programing hw1 김정출

6

03

문자열 뒤집기 Reverse String 문자열 뒤집는 알고리즘문자열의 시작을 가르키는 인덱스 start 와 (0x0a) 문자열의 끝을 가르키는 인덱스 end 를

이용하며 , 포인터러 접근해 문자열을 뒤집는다 . 뒤집어진 문자열은 fputs() 로 파일 쓰기한다

성능 향상 시도 2문자열 뒤집기

Page 7: adv system programing hw1 김정출

7

03

Stream Buffer 크기 제어

<stdio.h> 에 정의된 stream buffer 의 크기는 1024setvbuf() 를 통해 스트림 버퍼의 크기를 제어한다 .

성능 향상 시도 3stream buffer 크기 제어

첫 시도에서는 stream buffer 사이즈를 지정하는 BUFSIZE 를 1024 이상인 2048 로 지정하였으나

오히려 시간이 늘어났으며 , BUFSIZE 를 512, 256, 128 로 감소함에 따라 시간이 줄어들었다 .

최종 BUFSIZE 는 128 로 확정하였음 .

Page 8: adv system programing hw1 김정출

8

03

gcc 컴파일러 최적화컴파일 시에 컴파일러 최적화 옵션 – O1, –O2, … , -ON 를 통해 최적화를 진행한다 .

성능 향상 시도 4gcc 컴파일러 최적화 옵션

최종 측정에서는 최적화 O2 로 진행하였음 .

Page 9: adv system programing hw1 김정출

9

04 성능 향상 실패 요인

시도했으나 , 실패한 것들System Call 인 read() 함수는 다음과 같습니다 .ssize_t read (int fd, void *buf, size_t nbytes)

read() 를 이용해 파일을 읽어올 경우 , 버퍼의 크기만큼 가져올 경우 줄단위로 읽는 것이 아닌 , 통째로 짤리는 경우가 발생합니다 .짤리는 경우에서 파일 쓰기를 진행하면 라인 수가 늘어나게됩니다 .

이를 방지하기 위해 stktok() 함수를 이용해 ‘ \n’ 토큰으로 짤라 , 문자열 배열에 저장하여 처리하던 도중

진행을 write() 함수에서 진행을 못하였음 .

Page 10: adv system programing hw1 김정출

감사합니다