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


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.