bufio와 fmt의 속도차

백준 알고리즘을 풀며 배워보자
게시 날짜:
go 백준

갑자기 알고리즘 공부의 필요성을 느끼고, 백준을 풀지 않으면 내 프로그래밍 실력 향상 따윈 없을거라고 떠올라 요즘 백준 온라인 저지를 다시 풀기 시작했다.

그러다 빠른 A+B라는 문제를 발견하게 됐다. 문제의 설명 단락에는 각 언어별로 빠른 입출력을 위한 방법을 제시하고 있었고, Go의 경우에는 “bufio”였다. 나는 완전한 생초보라, fmt만 쓰고 속도문제에 대해 인지하지 못하고 있었는데 이번 기회에 “bufio” 패키지를 써보기로 하였다.

bufio vs. fmt

먼저 둘의 속도를 측정해보도록 하자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
	"bufio"
	"fmt"
	"os"
	"time"
)

func main() {
	start := time.Now()
	print := bufio.NewWriter(os.Stdout)
	print.Write([]byte("Haha\n"))
	print.Flush()
	end := time.Now()
	fmt.Println("bufio took,", end.Sub(start))

	time.Sleep(time.Millisecond)

	start = time.Now()
	fmt.Println("Haha")
	end = time.Now()
	fmt.Println("fmt took,", end.Sub(start))

}
Output:
Haha
bufio took, 13.73µs
Haha
fmt took, 71.673µs

예제는 간단한 “Haha\n”라는 문구를 얼마나 빨리 출력하는지 시간을 확인하는 것이다. 중간에 있는 time.Sleep()이 없으면 fmt의 속도가 비정상적으로 빠르길래(1µs) 넣었다. 따로따로 테스트해봐도 위의 Output처럼 나온다. fmt가 간단한만큼 시간을 더 잡아먹는건가… 하고 생각했다. bufio는 해줘야할게 많다. os도 import 시켜줘야하고, Write 함수, Flush 함수를 써줘야해서 코드의 길이가 그만큼 길어진다. 하지만 더 빠르게 출력한다.

앞으로 백준 온라인 저지 풀 때는 무조건 bufio를 써줘야겠다.

그러나 C가 좀 부럽다. scanf와 prinf가 충분히 빨라 다른 대안을 쓸 필요가 없다고 한다. C로 풀까나…