Stage1 코드
Stack을이용한 프로그램. 파일을 한 글자씩 Stack에 Push
해서 한 줄을 읽어들이고 다시 Pop해서 한 글자씩 출력해 결과
적으로 line-by-line으로 2개의 파일을 reverse-merge 하는
프로그램.
문자열을 뒤집는 함수를 만들지 않고 바로 Stack을 통해 출력
한다는 점이 간편했었음.
4.
Stage1 코드 소요시간
template108.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
실행횟수
버전
시간단위 : 초
1 2 3 4 5 평균
5.
Stage1 코드 설명
기본적인 Stack의 크기는 우선 100으로
해놓고 후에 메모리 공간이 더 필요하게
될 경우를 대비해 realloced 변수 선언
해 놓음
readaline 함수는 한 line을 한 글자씩
Stack에 Push하는 함수
reverse_out 함수는 Stack의 글자를
한 글자씩 출력해 역순으로 출력되게끔
하는 함수
IsEmpty 함수는 Stack이 비었는지 확
인해주는 함수, Push 함수는 Stack에
값 하나를 밀어넣는 함수, Pop 함수는
Stack에서 값 하나를 꺼내는 함수.
6.
한 글자씩Stack에 Push하고, 만
약 Stack의 크기가 한 line의 크기
보다 작을 경우 realloced 변수 값
을 하나 증가시킨 다음
STACK_SIZE * realloced 크기
만큼 메모리를 다시 할당한다.
7.
Stack에 있던글자들
을 !IsEmpty가 아닌 동안 Pop
하게 되면 결과적으로 뒤집어진
한 line을 fout에 출력하게 된
다. 한 줄을 readaline 함수로
읽어들이고 바로
reverse_out 함수로 역순으
로 출력하는 과정을 file1,
file2 돌아가면서 반복한다.
Stage1과 달라진 점은?
fgetc와fputs를 쓰는 것이 overhead를 상당히 많이 차지했다.
그 부분이 비효율적이라 판단이 되어서 Push와 Pop 등의 함수
를 필요로 하는 Stack을 사용하지 않기로 함.
따라서 100MB 파일을 fread 함수로 한 번에 읽어오는 방식을
택함.
10.
Stage2 코드
100MB 짜리파일 2개를 fread를 통해 각각 한 번에 읽어온
다.
strtok_r 함수를 써서 ‘n’ 문자를 기준으로 문장을 읽어들이
고 f_out 파일에 출력한다. 이 과정이 file1과 file2에서 반복
된다.
f_out 파일에 출력할 때는 fwrite 함수를 사용한다.
11.
Stage2 코드 설명
fread 함수로 100MB를 한번에 읽
어오기 위해 SIZE 라는 상수를
1024 * 1024 * 100으로 잡았다.
fout 파일에 출력하기 전에 문자열
을 먼저 뒤집어 주기 위해서 문자열
뒤집기 함수도 따로 만들어 줌.
12.
버퍼 2개,strtok_r 함수에서 한 line
을 읽어올 때 쓰일 line 시작과 끝을 나
타내줄 char형포인터 변수 선언.
버퍼1, 버퍼2 모두 100MB씩 동적할
당 해줌.
fread 함수로 버퍼1과 버퍼2에
100MB씩 한 번에 읽어옴.
13.
start point변수1, 2 모두 strtok_r 함
수가 ‘n’ 기준으로 문자열을 잘랐을 때의
포인터 값으로 해줌.
strtok_r가 반환한 포인터는 token ‘n’
을 포함하지 않으므로 fputc 함수로 ‘n’
따로 출력
strtok_r 함수가 반환한 포인터가 둘다
NULL일 때까지 반복.
14.
Stage2 코드 실행시간
template108.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
stage2 26.31586 40.876017 30.774619 29.260346 29.210764 31.2875212
실행횟수
버전
시간단위 : 초
1 2 3 4 5 평균
110.292081/31.2875212 = 0.28379
→성능이 약 3.53배 향상되었다!!!