关于fmt包Fprint系列方法的性能问题
作者:水不要鱼
(注:能力有限,如有说错,请指正!)
(原文发表在我的个人网站中:https://www.fishin.com.cn/blog/article.html?articleId=5)
最近在使用 Go 语言实现一个日志库 (logit) 的时候,发现了一个性能问题,经过 Go 的 cpuprofile 检测之后,
问题出在 fmt.Fprintf 中,于是我写了一个简单的测试案例,看看 Fprintf 的性能究竟比直接 writer.Write 差多少:
// 测试使用的 writer,不进行任何输出,避免 I/O 带来的测试波动
type nopWriter struct{
}
func (w *nopWriter) Write(p []byte) (n int, err error) {
return 0, nil
}
// 测试 Fmt.Fprintf 的性能
func BenchmarkFmtFprintf(b *testing.B) {
w := &nopWriter{
}
for i := 0; i < b.N; i++ {
fmt.Fprintf(w, "i")
}
}
// 测试直接 Write 的性能
func BenchmarkWriter(b *testing.B) {
w := &nopWriter{
}
for i := 0; i < b.N; i++ {
w.