今までGo言語でコーディングテストを学んでいたのですが、fmt.Scanでの入力が遅いせいでアルゴリズムが良くてもタイムアウトしてしまうことが発生していた。Scannerで入力するようにしたらタイムアウトが起きなくなり、fmt.ScanとScannerでどれくらい違うのかを今回比較しました。
試したこと
10,000行 * 10列のデータが入力された場合に実行時間とメモリの使用量が違うかを計測
計測にはAtCoderのコードテストを使用した
fmt.Scanを使用した場合
コード
package main
import(
"fmt"
)
func main(){
var n, m = 10000, 10
var input [][]int
input = make([][]int, n)
for i:=0;i<n;i++{
input[i] = make([]int, m)
for j:=0;j<m;j++{
fmt.Scan(&input[i][j])
}
}
}
結果
実行時間 206 ms
メモリ 5684 KB
Scannerを使用した場合
コード
package main
import(
"bufio"
"os"
"strconv"
)
func main(){
var n, m = 10000, 10
var input [][]int
scanner := bufio.NewScanner(os.Stdin) // 標準入力を受け付けるスキャナ
scanner.Split(bufio.ScanWords)
input = make([][]int, n)
for i:=0;i<n;i++{
input[i] = make([]int, m)
for j:=0;j<m;j++{
scanner.Scan()
input[i][j], _ = strconv.Atoi(scanner.Text())
}
}
}
結果
実行時間 11 ms
メモリ 1776 KB
fmt.Scanを使用すると、Scannerを使用した時より、実行時間が20倍近くかかるのがわかる
まとめ
Go言語での入力はScannerを使用するのが良いことがわかりました。
Go言語について他にも、selectの仕組みやゴルーチンで並行実行した処理のエラー検知する方法などの記事を書いておりますので、そちらも見てもらえたらと思います。
【おすすめ記事のリンク】
コメント