1.12 Go 语言中 hot path 有什么用呢?¶
hot path ,热点路径,顾名思义,是你的程序中那些会频繁执行到的代码。
对于这些代码,由于执行次数非常多,意味着只要有一点设计或编码问题,影响就会被不断放大,而相反,你只要在这些代码中做一些优化,带来的效果也是非常明显的。
hot path 只是一个概念,到底你的程序中有哪些 hot path 还需要根据实际情况分析。
这边举一个比较常见的 hot path 优化的例子,在 sync.Once
有这么一段代码
在注释中首次提到了 hot path
概念
// src/sync/once.go
// Once is an object that will perform exactly one action.
//
// A Once must not be copied after first use.
type Once struct {
// done indicates whether the action has been performed.
// It is first in the struct because it is used in the hot path.
// The hot path is inlined at every call site.
// Placing done first allows more compact instructions on some architectures (amd64/386),
// and fewer instructions (to calculate offset) on other architectures.
done uint32
m Mutex
}
这是什么意思呢?
当需要访问struct的第一个字段时,我们可以直接对指针解引用来访问第一个字段。
要访问其他字段时,除了结构指针之外, 还需要提供与第一个字段的偏移量
在机器码中,这个偏移量是传递指令的附加值,这会使指令变得更长。对性能的影响是,CPU必须对结构指针添加偏移量以获取想要访问的字段的地址。
因此访问struct的第一个字段的机器码更快,更加紧凑。
这里假设字段在内存中的布局与结构定义中的布局相同,因为编译器可以决定改变内存中结构的字段顺序来优化存储空间,目前go编译器未做这样的优化。
这是一个小优化,在一些对性能优化有极致的要求的人是值得得关注的点。