AI/O 효율성 테스트아푸에:
테스트 파일은 '98.5MB, 300만줄'이라고 한다.
"그림 3.6"에 사용된 코드:
#include "apue.h"
#define BUFFSIZE 4096
int
main(void)
{
int n;
char buf[BUFFSIZE];
while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)
if (write(STDOUT_FILENO, buf, n) != n)
err_sys("write error");
if (n < 0)
err_sys("read error");
exit(0);
}
가장 좋은 시간은 그림 3.6에 나와 있습니다.: 다양하게 활용 BUFFSIZE
하고 가장 좋은 시간을 선택하세요
그림 3.6의 단일 바이트 시간: 사용BUFFSIZE=1
err_sys
오류 처리를 위한 래퍼 함수일 뿐입니다.
apue.h
또한 래퍼 헤더 파일입니다.
코드 사용법 fgets
:
#include "apue.h"
int
main(void)
{
int c;
while ((c = fgetc(stdin)) != EOF){
if (fputc(c, stdout) == EOF)
err_sys("output error");
}
if (ferror(stdin))
err_sys("input error");
exit(0);
}
질문 출처:
이러한 타이밍 수치에 대한 마지막 흥미로운 점은 이 버전이 그림 3.6의 버전보다 훨씬 빠르다는 것입니다
fgetc
.BUFFSIZE=1
둘 다 동일한 수의 함수 호출(약 2억)을 포함하지만 이fgetc
버전은 사용자 CPU 시간이 16배 이상 빠르고 클럭 시간이 거의 39배 빠릅니다. 차이점은 read를 사용하는 버전은 2억 개의 함수 호출을 수행하고, 이는 다시 2억 개의 시스템 호출을 수행한다는 것입니다. 이fgetc
버전에서는 여전히 2억 개의 함수 호출을 수행하지만 이는 단지25,224시스템 호출. 시스템 호출은 일반적으로 일반 함수 호출보다 훨씬 비쌉니다.
테스트 파일은 98.5MB ≒ 100M이므로 각 I/O 함수는 1억번 == 2억번 호출하므로 여기서는 문제가 없습니다.
그런데 2억이 어떻게 fgets
해석되나요?25,224시스템 호출?
이
fgetc
버전에서는 여전히 2억 개의 함수 호출을 수행하지만 이는 단지25,224시스템 호출.
어떻게25,224계획된?