fgets에 대한 2억 개의 함수 호출은 어떻게 25,224개의 시스템 호출로 변환됩니까?

fgets에 대한 2억 개의 함수 호출은 어떻게 25,224개의 시스템 호출로 변환됩니까?

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계획된?

관련 정보