Đường dẫn nóng của Cameron có nghĩa là gì trong bối cảnh của sync.Once?


14

go phiên bản: 1.13.4 Trong đồng bộ mã nguồn / once.go , các ý kiến ​​sau đây đã đề cập đến "đường dẫn nóng":

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
}

Câu hỏi của tôi là:

  1. "Con đường nóng" nghĩa là gì ở đây?

  2. Liệu "Đây là lần đầu tiên trong cấu trúc" làm cho việc truy cập "đường dẫn nóng" hiệu quả hơn? Tại sao?


Tại sao đặt trường đầu tiên là thích hợp hơn được giải thích trong câu cuối cùng. Bất cứ điều gì không rõ ràng về điều đó?
Peter

Câu trả lời:


10

Một đường dẫn nóng là một chuỗi các hướng dẫn được thực hiện rất thường xuyên.

Khi truy cập vào trường đầu tiên của một cấu trúc, chúng ta có thể trực tiếp hủy bỏ con trỏ tới cấu trúc để truy cập vào trường đầu tiên. Để truy cập các trường khác, chúng tôi cần cung cấp một giá trị bù từ giá trị đầu tiên bên cạnh con trỏ cấu trúc.

Trong mã máy, phần bù này là một giá trị bổ sung cần truyền với lệnh làm cho nó dài hơn. Tác động hiệu năng là CPU phải thực hiện bổ sung phần bù vào con trỏ struct để lấy địa chỉ của giá trị cần truy cập.

Do đó, mã máy để truy cập vào trường đầu tiên của một cấu trúc nhỏ gọn hơn và nhanh hơn.

Lưu ý rằng điều này giả định rằng bố cục của các giá trị trường trong bộ nhớ giống như trong định nghĩa cấu trúc.


Bạn có thể mở rộng câu cuối cùng không? tức là khi nào không phải là trường hợp?
colminator

@colminator một trình biên dịch có thể quyết định thay đổi thứ tự trường của một cấu trúc trong bộ nhớ để tối ưu hóa không gian lưu trữ chẳng hạn. Trình biên dịch go không làm điều đó theo như tôi biết.
chmike

1
@chmike thx cho câu trả lời tuyệt vời của bạn. Tôi muốn biết điều đó có nghĩa là tôi nên đặt trường thường xuyên truy cập vào vị trí đầu tiên của cấu trúc trong công việc lập trình hàng ngày của mình?
Yalou Wang

1
@YalouWang Nó sẽ là một tối ưu hóa nhỏ. Nó chỉ đáng giá cho nỗ lực nếu hiệu suất là quan trọng.
chmike
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.