Go的fmt效率问题

Go 的 fmt 包提供了类似 C 标准库中的 scanf 和 printf 的系列输入输出函数。

// 输入 N*N 矩阵
var G [N][N]int
for i := 0; i < N; i++ {
	for j := 0; j < N; j++ {
		fmt.Scan(&G[i][j])
	}
}

但是 C 的标准输入输出默认是带缓冲的, 而 Go 的不带。 当有大量 I/O 时, 效率较低。 解决的办法是用 bufio 中带缓冲的类型。

in := bufio.NewReader(os.Stdin)
for i := 0; i < N; i++ {
	for j := 0; j < N; j++ {
		fmt.Fscan(in, &G[i][j])
	}
}

同理, 可用 bufio.Writer 对输出进行缓冲, 但是记得在程序退出前调用 Flush() 清空缓冲区。

数据量很大时, 使用 bufio.Scanner 配合 strconv 中的类型转换函数, 可以跳过 fmt 的复杂机制, 直接读取数据。

// 读取 N*N 矩阵, 均为整数
var G [N][N]int
in := bufio.NewScanner(os.Stdin)
in.Split(bufio.ScanWords)
for i := 0; i < N; i++ {
	for j := 0; j < N; j++ {
		in.Scan()
		value, _ := strconv.Atoi(in.Text())
		G[i][j] = value
	}
}

分享