2. 기존 Merge 프로그램
100MB 파일 2개를 만들어서 merge하기
실 행 횟 수
버전
1 2 3 4 5 평균
template 108.55211 115.78331 106.67649 113.37243 107.07607 110.292081
Reverse/merge(v1) 106.5771 101.40357 101.26789 104.43641 107.16964 104.170922
final(v3) 66.230124 75.91081 78.949841 73.23087 78.204549 74.5052388
시간단위 : 초
→Template의 경우 5번 실행시 평
균 110초가 걸렸음.
3. 내가 만든 reverse/merge 프로그램
Line-by-line으로 파일 읽어들이는 함수
• 알고리즘 : stack을 구현하여 readaline 함수를 실행했을 때 한
글자씩 stack에 Push하고 reverse_out함수에서 다시 Pop하여
f_out으로 출력하는 방식.
Stack의 원래 크기는 100으로 잡아놓음
한 Line을 fout 파일에 붙이는 함수
4. readaline함수
기존 코드에서 fputc로 바로
0x0a를 fout 파일에 출력하
던걸 대신 Stack에 Push함.
만약 gen.c로 만든 파일의
line 중에 100글자가 넘어가
는 line이 있을 경우에 동적
할당 했던 Stack 크기 2배로
동적할당 하기
파일에서 읽어들인 문자는
Stack에 Push해서 저장하기
9. 성능 향상을 위해 시도했던 것들(ver2)
(1) 동적 할당
처음에 Stack 크기를 100으로 정해 놓았지만 gen으로 만든 파일
의 한 line의 크기가 100을 넘어가는 경우가 종종 있어서 동적할
당으로 변경함.
10. 성능 향상을 위해 시도했던 것들(ver2)
(2) fputc보다는 fgets 이용하기
ver2를 처음 완성했을 때 reverse_out 함수에서는 Stack에서 Pop해서 반환되는
값을 fputc로 바로 출력하도록 되어 있었음.
그러나 그 결과를 perf report로 보니 fputc의 overhead가 생각보다 너무 크게
나온다는 것을 알게됨.
11. 우선 배열을 지역 변수로 선언해 놓음
Readaline함수에서 한 줄 씩 읽어
서 Stack에 저장해 놓은 것을 Pop
해서 배열로 저장해놓음.
배열을 fputs로 출력
12. 바꾸고 나서 perf report 결과를 보니 fputc에서 overhead를 은근히 많이 차
지하던 걸 줄일 수 있었고 아직 fgetc가 차지하는 overhead가 많이 남아 있었
지만 시간은 확실히 많이 줄어듬.
13. 성능 향상을 위해 시도했던 것들(ver2)
(3) fprintf함수 이용하기
기존에 fputs를 이용해 구현한 걸 fprintf를 사용하면 어떨까 해
서 그 부분을 바꿔 보았었다. 성공은 했었지만 fputs와 비교 했을
때 5번 실행했을 때 시간 차이도 3초 정도 더 느리고 그 외엔 차
이가 없어서 그냥 폐기.