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

Stage2

  • 1.
  • 2.
  • 3.
    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 돌아가면서 반복한다.
  • 8.
  • 9.
    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배 향상되었다!!!
  • 15.