【问题标题】:What does "hot path" mean in the context of sync.Once?在 sync.Once 的上下文中,“热路径”是什么意思?
【发布时间】:2020-03-29 03:31:45
【问题描述】:

转到版本:1.13.4 在源代码sync/once.go中,以下cmets提到了“热路径”:

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
}

我的问题是:

  1. 这里的“热路径”是什么意思?

  2. “It is first in the struct”是否会使“热路径”访问更有效?为什么?

【问题讨论】:

  • 为什么将字段放在第一位是可取的,这在最后一句中进行了解释。有什么不清楚的地方吗?
  • 计算偏移量

标签: go


【解决方案1】:

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

当访问结构体的第一个字段时,我们可以直接解引用该结构体的指针来访问第一个字段。要访问其他字段,除了结构指针之外,我们还需要提供从第一个值开始的偏移量。

在机器代码中,此偏移量是与指令一起传递的附加值,使其更长。性能影响是 CPU 必须将偏移量添加到结构指针才能获取要访问的值的地址。

因此访问结构的第一个字段的机器代码更紧凑、更快。

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

【讨论】:

  • 你能扩展最后一句话吗?即......什么时候不是这种情况?
  • @colminator 编译器可以决定更改内存中结构的字段顺序以优化存储空间。据我所知,go 编译器并没有这样做。
  • @chmike 感谢您的出色回答。我想知道在我的日常编程工作中是否意味着我应该把经常访问的字段放在结构的第一位?
  • @YalouWang 这将是一个小优化。只有在性能很重要的情况下才值得付出努力。
猜你喜欢
  • 1970-01-01
  • 2018-08-31
  • 2012-03-12
  • 2023-04-06
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
相关资源
最近更新 更多