sync.Onceのコンテキストで「ホットパス」とはどういう意味ですか?


14

go version:1.13.4ソースコードsync / once.goで、次のコメントは「ホットパス」について言及しています:

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. 「構造体の最初」は「ホットパス」アクセスをより効率的にしますか?どうして?


フィールドを最初に配置することが望ましい理由は、最後の文で説明されています。それについて不明な点はありますか?
Peter

回答:


10

ホットパスは、非常に頻繁に実行される一連の命令です。

構造体の最初のフィールドにアクセスするとき、構造体へのポインタを直接逆参照して、最初のフィールドにアクセスできます。他のフィールドにアクセスするには、構造体ポインタに加えて、最初の値からのオフセットを提供する必要があります。

機械語コードでは、このオフセットは命令とともに渡す追加の値であり、命令を長くします。パフォーマンスへの影響は、CPUがアクセスする値のアドレスを取得するために、構造体ポインターへのオフセットの追加を実行する必要があることです。

したがって、構造体の最初のフィールドにアクセスするためのマシンコードは、よりコンパクトで高速です。

これは、メモリ内のフィールド値のレイアウトが構造体の定義と同じであることを前提としていることに注意してください。


最後の文を拡張できますか?つまり、そうでない場合はいつですか?
コルミネーター

@colminatorコンパイラは、メモリ内の構造体のフィールドの順序を変更して、たとえばストレージスペースを最適化することを決定できます。goコンパイラーは、私の知る限りこれを行いません。
chmike

1
@chmike thxの優れた回答 日常のプログラミング作業で、頻繁にアクセスされるフィールドを構造体の最初に配置する必要があることを意味しますか?
Yalou Wang

1
@YalouWang小さな最適化になります。パフォーマンスが重要な場合にのみ、努力する価値があります。
chmike
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.