동기화 컨텍스트에서 "핫 경로"는 무엇을 의미합니까?


14

go version : 1.13.4 소스 코드 sync / once.go 에서 다음 주석은 "hot path"를 언급했습니다.

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

@colminator 컴파일러는 메모리에서 구조체의 필드 순서를 변경하여 스토리지 공간을 최적화 할 수 있습니다. go 컴파일러는 내가 아는 한 그렇게하지 않습니다.
chmike

1
훌륭한 답변을 @chmike thx. 나는 일상적인 프로그래밍 작업에서 자주 액세스하는 필드를 구조체의 첫 번째 장소에 두어야한다는 것을 알고 싶습니까?
Yalou Wang

1
@YalouWang 작은 최적화 일 것입니다. 성능이 중요하다면 노력의 가치가 있습니다.
chmike
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.