특정한 상황에서 fread 가 read 보다는 빠르겠지만, fopen 이
open 보다 빠르진 않을겁니다.
fread 가 빠른 이유는 경유 버퍼 (intermediate buffer)를
가지고 입출력을 하기 때문입니다. 일정한 크기의 데이터가
입력되거나 출력될때까지, 물리적으로 입출력을 행하지
않기 때문입니다. 그래서, 작은 크기 데이터를 빈번하게
입출력하면 fread 가 훨씬 빠릅니다. 그런데, 큰 데이터를
입출력하면 속도차가 줄거나, read 가 더 빠를 수도 있습니다.
특히 fseek 과 lseek 이 들어가게 되면 경유버퍼를 사용하는
fread 는 필요한 크기보다 더 많은 양을 읽을 경우가 많고
경유 버퍼에대한 처리도 해줘야하기 때문에, 효율이 더
떨어지는 경우가 있습니다. 쓰기를 할때도 비슷한 원인으로
마찬가지 결과를 보이지요.
어쨌든, 연속된 데이터 스트림을 읽는 경우는 fread 나 fwrite
이 더 빠를 수 밖에 없는데, 이걸 시스템콜과 비교할 건 아니라고
봅니다. 프로그래밍 테크닉 정도로 여겨지는군요.
Re: 직접 시스템 콜이 더 느린 이유?
특정한 상황에서 fread 가 read 보다는 빠르겠지만, fopen 이
open 보다 빠르진 않을겁니다.
fread 가 빠른 이유는 경유 버퍼 (intermediate buffer)를
가지고 입출력을 하기 때문입니다. 일정한 크기의 데이터가
입력되거나 출력될때까지, 물리적으로 입출력을 행하지
않기 때문입니다. 그래서, 작은 크기 데이터를 빈번하게
입출력하면 fread 가 훨씬 빠릅니다. 그런데, 큰 데이터를
입출력하면 속도차가 줄거나, read 가 더 빠를 수도 있습니다.
특히 fseek 과 lseek 이 들어가게 되면 경유버퍼를 사용하는
fread 는 필요한 크기보다 더 많은 양을 읽을 경우가 많고
경유 버퍼에대한 처리도 해줘야하기 때문에, 효율이 더
떨어지는 경우가 있습니다. 쓰기를 할때도 비슷한 원인으로
마찬가지 결과를 보이지요.
어쨌든, 연속된 데이터 스트림을 읽는 경우는 fread 나 fwrite
이 더 빠를 수 밖에 없는데, 이걸 시스템콜과 비교할 건 아니라고
봅니다. 프로그래밍 테크닉 정도로 여겨지는군요.
댓글 달기