랜덤 생성 된 입력 파일을 읽고 동일한 문자열을 반향 출력하는 동일한 프로그램을 제공 한 후. 유일한 차이점은 한 쪽에서는 리눅스 syscalls에서 읽기 및 쓰기 메소드를 제공하고 다른 쪽에서는 fread/fwrite를 사용하고 있다는 것입니다.왜 fwrite libc 함수가 syscall write 함수보다 빠릅니까?
크기가 10Mb 인 입력을 사용하여/dev/null에 출력하고 파일이 캐시되지 않았는지 확인하면서 매우 작은 버퍼를 사용할 때 libc의 fwrite가 큰 배율로 빠릅니다. (1 바이트의 경우).
real 0m0.948s
user 0m0.780s
sys 0m0.012s
그리고 콜 쓰기 사용 :
real 0m8.607s
user 0m0.972s
sys 0m7.624s
내가 생각할 수있는 유일한 가능성은 내부적으로 libc에 이미 내 버퍼링이다를 여기
는에 fwrite를 사용하여, 시간에서 내 출력 입력 ... 불행히도 웹상에서 많은 정보를 찾을 수 없으므로 여기의 전문가가 나를 도울 수 있습니다.
"내부적으로 libc가 이미 내 입력을 버퍼링하고 있습니다". 이것이 바로 그것이하는 일입니다. 당신이 원한다면 아마 libc의 소스 코드를 읽을 수도 있고, 정확히 어떻게하고 있는지 볼 수 있습니다. – kquinn