강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

yoon6669님의 프로필 이미지
yoon6669

작성한 질문수

김영한의 실전 자바 - 고급 2편, I/O, 네트워크, 리플렉션

파일 입출력과 성능 최적화4 - Buffered 스트림 읽기

BufferedInputStream이 1바이트씩 조회해도 성능이 좋은 이유

작성

·

24

·

수정됨

0

BufferedInputStream에서 read() 를 호출하면 buf 라는 버퍼에 있는 것을 1바이트씩 꺼내어 조회한다고 하는데, 그렇다면 처음에 FileInputStream에서 하나씩 read() 하는 것이랑 결국 호출 횟수는 같으니 똑같은 것 아닌가? 하는 생각이 들었습니다.

그러니까 버퍼에 데이터 100바이트를 FileInputStream에서 한번에 들고와도 결국 바깥에서는 1바이트씩 꺼낸다고하니 뭐가 다른건가 궁금해졌습니다.

 

강의에서 버퍼에 데이터가 채워져있으면 FileInputStream의 read()를 호출하지 않고 바로 버퍼에서 꺼내준다고 하셨는데요, 여기서 버퍼에 한번에 많이 가져옴으로서 FileInputStream의 read()를 적게 호출하게 되기 때문에 이에 따라 시스템콜도 적게 호출되므로 성능이 증가하는건가요?

앞의 강의에서 FileInputStream과 FileOutputStream의 read(),write()의 횟수를 줄여야 성능이 증가한다고 하셨으니까요.

그래서 BufferedInputStream의 read()로 1바이트씩 꺼내는건 성능에 큰 지장이 없는 것인가요?

 

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. yoon6669님.

BufferedInputStream의 사용과 관련하여 성능 향상의 이유에 대해 설명드리겠습니다. 주목할 점은 버퍼링을 사용하여 시스템 호출(System Call) 횟수를 줄임으로써 성능을 최적화하는 것입니다.

  1. 버퍼링의 목적: FileInputStream에서 read() 메서드는 기본적으로 하드웨어 디스크로부터 직접 데이터를 읽는 작업을 수행합니다. 하드웨어와의 직접적인 인터페이스는 매우 느릴 수 있으며, 자주 호출될 경우 성능에 큰 악영향을 미칠 수 있습니다. 이를 최소화하기 위해 BufferedInputStream은 내부적으로 일정 크기의 버퍼(예: 8KB 정도)를 사용하여 한 번에 데이터를 많이 읽어옵니다.

  2. 시스템 콜 감소: BufferedInputStream이 디스크로부터 데이터를 한 번에 읽어, 버퍼에 저장합니다. 초기 한번의 시스템 콜로 많은 양의 데이터를 가져온 후, 버퍼에 저장된 데이터를 1바이트씩 읽어오는 과정에서는 추가적인 시스템 콜이 발생하지 않습니다. 따라서, BufferedInputStream을 사용할 때는 하드웨어와의 상호작용 측면에서의 오버헤드가 줄어들게 됩니다.

  3. 결과적으로 성능 향상: 사용자가 read() 메서드를 반복적으로 호출할 경우, FileInputStream과는 달리 BufferedInputStream은 버퍼로부터 데이터를 직접 제공하므로 시스템 콜이 실질적으로 줄어들어 성능이 향상됩니다. 이는 디스크로부터 데이터를 지속적으로 읽어오는 대신, 메모리 상의 버퍼에서 데이터를 가져오게 되면서 속도 이득을 얻기 때문입니다.

이러한 이유로 BufferedInputStream은 많은 I/O 작업을 수행하는 프로그램에서 자주 활용됩니다. 귀하가 언급하신 부분처럼 데이터가 저장된 버퍼에서 read() 호출 시, 성능 감소가 없으며, 오히려 시스템 콜 횟수를 줄임으로써 성능이 향상됩니다.

유사한 질문을 참고해 보시려면 다음 링크를 확인해 보시길 권장드립니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

yoon6669님의 프로필 이미지
yoon6669

작성한 질문수

질문하기