5. 1. 기존 merge의 성능 분석
Perf report를 통한 분석
fputc() 함수가 가장 오버헤드가 높다.
6. 2. 새로운 merge 구현
Object:
1. 평균 완료시간인 124.954 sec 보다 빠른 시간 내에 수행하게 한다.
-> fputc() 함수를 fread() 함수로 바꾼다.
2. 출력파일에 입력파일에서 읽어온 한 줄을 거꾸로 출력 한다.
-> strrev()함수 구현.
7. 2. 새로운 merge 구현
fputc() -> fread()
기존 함수인 readline_and_out()을 사용.
fread():한 라인 크기의 버퍼에 입력 받고 출력파일에 출력한다.
Q1: 한 라인의 길이가 입력버퍼보다 큰 경우?
-> 문제발생 입력파일의 한 줄의 최대길이 정보를 알아야 한다.
Q2: 한 라인을 입력 받은 후 추가로 읽어온 데이터는?
-> fseek() 함수를 통해 파일의 커서 포인터를 마지막으로 읽은 한
라인의 끝의 다음으로 옮긴다. (버퍼낭비)
-> 예비 버퍼를 쓸 수 도 있다.
11. 2. 새로운 merge 구현
새로운 merge의 성능 분석
Strrev() 함수가 가장 오버헤드가 높음.
12. 3. 추가적인 성능향상 방향
1. Strrev() 성능향상
기존의 알고리즘:
1. 파일에서 버퍼로 100바이트를 가져온다. Fraed()
2. 버퍼에서 라인피드를 찾는다. strchr()
3. 버퍼안에서 tmp를 이용해 위치를 바꾼다. strrev()
4. 출력파일에 한 라인의 캐릭터 수만큼 출력한다. fwrite()
스택을 이용한 알고리즘:
1. 파일에서 버퍼로 100 바이트를 가져온다.
2. 버퍼에서 스택으로 라인피드가 나올때 까지 한 캐릭터씩 넣는다.
3. 스택에서 뽑아서 다시 버퍼에 넣는다. (라인피드 추가)
4. 출력파일에 한 라인의 캐릭터 수만큼 출력한다.
기대효과:
기존 알고리즘의 2번 3번을
합쳐 성능이 좋아질 것이다.
13. 3. 추가적인 성능향상 방향
2. fread() 호출 줄이기
기존의 알고리즘의 문제점:
한 라인의 최대 길이를 알아야 한다.
각 라인을 병합 할 때마다 fread(), fwrite()를 호출한다.
-> 버퍼의 크기를 크게 하면 어떨까?
-> Smallmerge();
15. 3. 추가적인 성능향상 방향
버퍼사이즈는 어떻게?
N개 섹터의 크기 = 블록 = 가상 메모리의 페이지크기 = 512Byte
16. 3. 추가적인 성능향상 방향
3. register keyword
Register 키워드로 선언된 변수는 CPU의 레지스터에 등록되어 메모리에서 참조하지 않고 연산하여 속도가 빠르다.
CPU의 상황에 따라 무시될 수 있음.
성능향상 (X)
이미 자주사용 할 것 같은 변수는 컴파일러가 레지스터 등록을 함.
라즈베리파이가 바쁨.