这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
1. 高质量编程
编写的代码能够达到正确可靠、简洁清晰的目标则可称之为高质量代码。
性能优化的前提是满足正确可靠、简洁清晰等质量因素。
性能优化是综合评估,有时候时间效率和空间效率可能对立。 错误处理:
-
简单错误指的是仅出现一次的错误,在其他地方不需要捕获,优先使用
errors.New创建匿名变量直接表示;如有格式化需求,使用fmt.Errorf; -
在
fmt.Errorf中使用%w将一个错误关联至错误链中; -
判定一个错误是否为特定错误,使用errors.Is,不同于==,使用该方法可以判定错误链上的所有错误是否含有特定的错误。
-
在错误链上获取特定种类的错误,使用errors.As
-
只有在程序启动阶段发生不可逆转的错误时才使用
panic(类似于 Javajava.lang.Error的地位,但是 Go 可以使用revover语句来从panic中恢复;
2. 性能调优实战
性能调优的原则:
- 要依靠数据不是猜测
- 要定位最大瓶颈而不是细枝末节
- 不要过早优化
- 不要过度优化
可以使用Benchmark来进行基准测试。
在使用slice和map时候通过make指定容量,尽量为其预分配内存。
要注意Slice的内存未释放问题:在已有切片的基础上创建切片,不会创建新的底层数组。解决方法:可用copy替代re-slice。
在字符串拼接时,使用+拼接性能最差,string.Builder,byte.Builder相近,string.Builder更快。
性能分析工具 pprof
pprof是用于可视化和分析性能分析数据的工具。
搭建pprof实践项目
import (
"log"
"net/http"
_ "net/http/pprof"
"os"
"runtime"
"time"
"github.com/wolfogre/go-pprof-practice/animal"
)
func main() {
log.SetFlags(log.Lshortfile | log.LstdFlags)
log.SetOutput(os.Stdout)
runtime.GOMAXPROCS(1)
runtime.SetMutexProfileFraction(1)
runtime.SetBlockProfileRate(1)
go func() {
if err := http.ListenAndServe(":6060", nil); err != nil {
log.Fatal(err)
}
os.Exit(0)
}()
for {
for _, v := range animal.AllAnimals {
v.Live()
}
time.Sleep(time.Second)
}
}