앞에서 표준 입출력에서는 버퍼링 정책(FULL BUFFERING, LINE BUFFERING, NULL BUFFERING)을 사용한다는 것을 알아보았어요. 이번에는 간단하게 open, write, close 시스템 호출을 이용한 RAW 입출력과 표준 입출력의 성능을 비교해 보기로 할게요.
다음은 1바이트씩 10000번 파일에 기록하는 것을 RAW 입출력과 표준 입출력을 사용하는 것을 비교하는 소스 코드입니다. 표준 입출력을 사용하는 것은 0부터 8000까지 500씩 늘려가면서 버퍼를 설정하고 있어요.
/********************************************************************** * ex_performance.c * * exmple source – test I/O performance * **********************************************************************/ #include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <time.h> void UsingRawIO(); void UsingBufferedIO(int bsize); int main() { clock_t st, et; st = clock(); UsingRawIO(); et = clock(); printf("RAW I/O:%u\n", (unsigned)(et - st)); int i = 0; for(i=0; i<8000; i+=500) { st = clock(); UsingBufferedIO(i); et = clock(); printf("Buffered I/O bsize<%d> :%u\n", i, (unsigned)(et-st)); } return 0; } void UsingRawIO() { int fd = open("test",O_CREAT|O_WRONLY|O_TRUNC,0644); int i = 0; for(i=0;i<100000;i++) { write(fd,&i,1); } close(fd); remove("test"); } void UsingBufferedIO(int bsize) { char buf[8000]; FILE *fp = fopen("test","w"); setvbuf(fp, buf, _IOFBF, bsize); int i =0; char data='a'; for(i=0; i<100000; i++) { fwrite(&data, 1, 1, fp); } fclose(fp); }
실험 결과를 보면 RAW 입출력보다 표준 입출력이 성능이 뛰어난 것을 알 수 있습니다. 이러한 성능 차이를 보이는 이유는 표준 입출력에서는 실질적인 입출력 횟수를 줄였기 때문입니다. FULL BUFFRING 정책에서 fwrite 함수로 1바이트를 기록을 요청하면 버퍼에 기록을 하며 실질적인 입출력은 버퍼가 꽉 찼을 때 수행합니다. 실제 입출력은 느린 장치(하드 디스크)를 사용하는 것이지만 버퍼에 기록하는 것은 실제 입출력보다 상대적으로 빠른 장치(메모리)를 사용하기 때문입니다.