Go中的hot path含义

hot path

在翻阅Go中sync.Once源代码的时候,在注释里面发现一个神秘的名词:hot path

1
2
3
4
5
6
7
8
9
10
// Once is an object that will perform exactly one action.
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/x86),
// and fewer instructions (to calculate offset) on other architectures.
done uint32
m Mutex
}

那么,什么是hot path呢?

什么是hot path

stackoverflow上给出的回答 ¹:

热路径是非常频繁执行的一系列指令。

访问结构的第一个字段时,我们可以直接获取结构的指针以访问第一个字段。要访问其他字段,除了结构指针之外,我们还需要提供与第一个值的偏移量。

在机器代码中,此偏移量是随指令传递的附加值,对性能的影响是:CPU必须对struct指针执行偏移量的加法运算以获得要访问的值的地址。

因此,用于访问结构的第一个字段的机器代码更加紧凑和快速。

请注意,这假设字段值在内存中的布局与结构定义中的相同。

总结

通俗的讲:

  1. hot path是一个结构体中频繁被访问的字段(每个字段的访问对于结构体来说就是一个访问路径,同时对应cpu中的若干指令)
  2. 为了优化这种操作,把频繁被访问的字段作为结构体的第一个字段(好处是,结构体的第一个字段的地址就是结构体的地址,节省了进行偏移计算的指令

最后不得不说,对于程序开发来说,优化无处不在。可能平时大家习以为常的最优代码,从计算机底层来看并不是最优。当然,这又引出了一个问题:学好底层是多么的重要。

参考

[1] 《What does “hot path” mean in the context of sync.Once?》
https://stackoverflow.com/questions/59174176/what-does-hot-path-mean-in-the-context-of-sync-once