빠른 입출력

bufio.Writer

: buffered I/O를 이용한 빠른 쓰기 모듈

시스템 내에서 쓰기 작업 (Write)는 운영체제 내에서 시스템 콜 (syscall)중 하나에 속한다. 이는 CPU의 지나친 부하의 원인이 되므로, 자잘한 쓰기 작업 (Write)의 오버헤드를 막기 위해 bufio.Writer를 사용한다.

스크린샷 2023-07-24 오후 2.30.37.png

⇒ 일반적인 Buffer 시스템이 다음과 같이 작동하는 것처럼, GoLang의 bufio.Writer 역시 문자가 바로 최종 목적지로 향하는 것이 아닌, Buffer에 일차적으로 축적되고 그 후 순차적으로 최종 위치에 전송된다.

cf. JAVA의 BufferedWriter, BufferedReader

public static void main(String[] args) throws IOException {
	BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	...

	bw.flush();
	br.close();
	bw.close();
}

Producer에서 입력값을 받으면 다음과 같은 경로를 통해 io.Writer에 도달한다.

producer         buffer           destination (io.Writer)

   a    ----->   a
   b    ----->   ab
   c    ----->   abc
   d    ----->   abcd
   e    ----->   e      ------>   abcd
   f    ----->   ef               abcd
   g    ----->   efg              abcd
   h    ----->   efgh             abcd
   i    ----->   i      ------>   abcdefgh

bufio.Reader

: 데이터들을 배치 단위로 분할한 후에 각 Consumer에서 읽고자 하는 문자들을 입력 받는다.

abcd -----> abcd -----> a
            abcd -----> b
            abcd -----> c
            abcd -----> d
efgh -----> efgh -----> e
            efgh -----> f
            efgh -----> g
            efgh -----> h
ijkl -----> ijkl -----> i
            ijkl -----> j

⇒ “abcdefghijkl”이라는 문자열이 있고 이를 앞에서 10글자까지만 읽고자 할 때, 원래라면 총 읽기 작업은 10번 수행된다. 이 때 전체 문자열을 다 가져오는 것이 아닌, 일정 배치 단위로 분할한 후에 부분적으로 읽고자 하는 데이터를 읽는다.

따라서 abcd, efgh, ijkl로 분할한 후에, 각 분할한 부분에서 순서대로 읽는다. 따라서 최종적으로 디스크에서 수행되는 읽기 작업은 총 3번 밖에 되지 않는다.

자료형 (Enum, 배열, Map)

Enum

:Golang은 기본적으로 c++이나 python과 달리 열거형 타입을 지원하지 않는다. 그러나 enum의 목적은 우Mapping을 달성할 수 있다.