고급시스템 프로그래밍
Advanced system programming
- File Merge program -
전자공학부
20113144
심승범
◎ 과제에서 기본적으로 사용된 reverse 함수
char* str_reverse(char *str);
입력으로 받은 문자열을 reverse해서
반환해준다.
p1은 str의 처음, p2는 str의 마지막을 가리키며
tmp를 이용해 순서를 바꾼다.
◎ PPT에 나온 프로그램들의 공통적인 f_out
결과적으로 모두 양식을 맞춰서 출력되는 것을 확인했다.
제공된 merge.c 성능
소요된 시간 : 74.370743 sec
Task-clock : 70027.682231
Cycles : 62,913,836,113
Branches : 3,906,443,220
Branch-misses : 472,516,934
* 소요시간은 stdout으로 출력된 시간을 바탕으로 함
제공된 merge.c 성능
record할 때 77초 이상의 시간 소요
report로 확인 했을 때 파일에서
문자를 읽어올 때 많은 비용이 발생
하는 것을 확인.
 File에서 내용을 읽어오는 것에
관해서 수정의 필요성
1. read() 사용
ssize_t read(int fildes, void *buf, size_t nbyte);
설명 : open() 함수로 열기를 한 파일의 내용일 읽는다
헤더 : unistd.h
인수 : int fd - 파일 디스크립터
void *buf - 파일을 읽어 들일 버퍼
size_t nbytes – 버퍼의 크기
반환 : ssize_t – 정상적으로 실행되었다면 읽어드린 바이트 수
실패시 -1 반환
Read를 활용한 코드
첫 시도 때 strtok_r로 파일을 분할했을 때
n을 사용하여 분할 했으므로 문자열 에서는
n이 포함되지 않았다.
fout에서 정확한 포맷을 맞추기 위해
wirte를 두 번 사용
open을 이용하여 file open
결과적으로 origin 코드보다 좋지 않은 성능이 나왔다.
write를 두번씩 사용하여 fout에 쓰기를 진행해서
다음과 같은 결과가 나왔다고 판단.
read활용 코드 결과
read활용 코드 결과
write를 한번만 쓰는 방식으로
코드를 수정하여 시도.
origin보다 좋은 결과를 얻음.
▶ 만족할만한 결과가 나오지 않아서 파일 입출력 방식을 바꿔보기로 함
2. fread() 사용
size_t fread(void *ptr, size_t size, size_t nitems, FILE *stream);
설명 : 파일을 통해 데이터를 읽어 들인다.
헤더 : stdio.h
인수 : void *ptr – 파일 내용을 읽어 들일 메모리 포인터
size_t size – 데이터 하나의 크기
size_t nitems – 읽어 들일 데이터의 개수
FILE *stream – 대상 파일 스트림
반환 : size_t – 읽어들인 데이터 개수를 반환, 오류시 -1 반환
fread를 활용한 코드
fopen을 이용하여 file open
fread를 사용하여 스트림의 내용을
buf에 저장
fwrite를 사용하여 fout에 출력.
strtok_r로 인해 스트링에 n이
생략 되었으므로 fputc를 이용하여
n문자를 넣어 줌
fread활용 코드 결과
소요된 시간 : 16.897485 sec
Task-clock : 12469.908482
Cycles : 11,185,986,420
Branches : 1,137,342,741
Branch-misses : 102,141,502
* 소요시간은 stdout으로 출력된 시간을 바탕으로 함
fread활용 코드 5회 평균값
5회 평균으로 15.486612의 결과를 얻음
fread활용 코드 ( fputc -> fprintf )
fputc()  fprintf() 5회 평균값
개행 문자를 넣는 용도로 쓰인
fputc()를 fprintf()로 바꿔 보기로 함
결과적으로 사진을 캡처할 당시에는
fputc()보다 좋은 결과를 얻음
하지만 perf stat으로 각각의 성능을
비교해본 결과 거의 차이가 없었음
 fputc()와 fprintf()는 성능적인 차이가
거의 없다고 결론
perf report를 확인해본 결과
origin에 비해서 파일 입출력시에
드는 비용이 많이 감소한 것을 확인
◎ 성능 비교
• 성능 = (최종 버전 실행 시간) / (Template 실행 시간)
• 5회 평균값을 기준으로 비교
origin - 74.9979288 sec new - 13.5529876
sec
13.5529876 / 74.9979288 =
0.180711

고급시스템프로그래밍

  • 1.
    고급시스템 프로그래밍 Advanced systemprogramming - File Merge program - 전자공학부 20113144 심승범
  • 2.
    ◎ 과제에서 기본적으로사용된 reverse 함수 char* str_reverse(char *str); 입력으로 받은 문자열을 reverse해서 반환해준다. p1은 str의 처음, p2는 str의 마지막을 가리키며 tmp를 이용해 순서를 바꾼다.
  • 3.
    ◎ PPT에 나온프로그램들의 공통적인 f_out 결과적으로 모두 양식을 맞춰서 출력되는 것을 확인했다.
  • 4.
    제공된 merge.c 성능 소요된시간 : 74.370743 sec Task-clock : 70027.682231 Cycles : 62,913,836,113 Branches : 3,906,443,220 Branch-misses : 472,516,934 * 소요시간은 stdout으로 출력된 시간을 바탕으로 함
  • 5.
    제공된 merge.c 성능 record할때 77초 이상의 시간 소요 report로 확인 했을 때 파일에서 문자를 읽어올 때 많은 비용이 발생 하는 것을 확인.  File에서 내용을 읽어오는 것에 관해서 수정의 필요성
  • 6.
    1. read() 사용 ssize_tread(int fildes, void *buf, size_t nbyte); 설명 : open() 함수로 열기를 한 파일의 내용일 읽는다 헤더 : unistd.h 인수 : int fd - 파일 디스크립터 void *buf - 파일을 읽어 들일 버퍼 size_t nbytes – 버퍼의 크기 반환 : ssize_t – 정상적으로 실행되었다면 읽어드린 바이트 수 실패시 -1 반환
  • 7.
    Read를 활용한 코드 첫시도 때 strtok_r로 파일을 분할했을 때 n을 사용하여 분할 했으므로 문자열 에서는 n이 포함되지 않았다. fout에서 정확한 포맷을 맞추기 위해 wirte를 두 번 사용 open을 이용하여 file open
  • 8.
    결과적으로 origin 코드보다좋지 않은 성능이 나왔다. write를 두번씩 사용하여 fout에 쓰기를 진행해서 다음과 같은 결과가 나왔다고 판단. read활용 코드 결과
  • 9.
    read활용 코드 결과 write를한번만 쓰는 방식으로 코드를 수정하여 시도. origin보다 좋은 결과를 얻음. ▶ 만족할만한 결과가 나오지 않아서 파일 입출력 방식을 바꿔보기로 함
  • 10.
    2. fread() 사용 size_tfread(void *ptr, size_t size, size_t nitems, FILE *stream); 설명 : 파일을 통해 데이터를 읽어 들인다. 헤더 : stdio.h 인수 : void *ptr – 파일 내용을 읽어 들일 메모리 포인터 size_t size – 데이터 하나의 크기 size_t nitems – 읽어 들일 데이터의 개수 FILE *stream – 대상 파일 스트림 반환 : size_t – 읽어들인 데이터 개수를 반환, 오류시 -1 반환
  • 11.
    fread를 활용한 코드 fopen을이용하여 file open fread를 사용하여 스트림의 내용을 buf에 저장 fwrite를 사용하여 fout에 출력. strtok_r로 인해 스트링에 n이 생략 되었으므로 fputc를 이용하여 n문자를 넣어 줌
  • 12.
    fread활용 코드 결과 소요된시간 : 16.897485 sec Task-clock : 12469.908482 Cycles : 11,185,986,420 Branches : 1,137,342,741 Branch-misses : 102,141,502 * 소요시간은 stdout으로 출력된 시간을 바탕으로 함
  • 13.
    fread활용 코드 5회평균값 5회 평균으로 15.486612의 결과를 얻음
  • 14.
    fread활용 코드 (fputc -> fprintf ) fputc()  fprintf() 5회 평균값 개행 문자를 넣는 용도로 쓰인 fputc()를 fprintf()로 바꿔 보기로 함 결과적으로 사진을 캡처할 당시에는 fputc()보다 좋은 결과를 얻음 하지만 perf stat으로 각각의 성능을 비교해본 결과 거의 차이가 없었음  fputc()와 fprintf()는 성능적인 차이가 거의 없다고 결론
  • 15.
    perf report를 확인해본결과 origin에 비해서 파일 입출력시에 드는 비용이 많이 감소한 것을 확인
  • 16.
    ◎ 성능 비교 •성능 = (최종 버전 실행 시간) / (Template 실행 시간) • 5회 평균값을 기준으로 비교 origin - 74.9979288 sec new - 13.5529876 sec 13.5529876 / 74.9979288 = 0.180711