Theo đề xuất của người khác, Interlocked.Increment
sẽ có hiệu suất tốt hơn so với lock()
. Chỉ cần nhìn vào IL và Assembly nơi bạn sẽ thấy rằng Increment
biến thành một tuyên bố "bus lock" và biến của nó được tăng lên trực tiếp (x86) hoặc "added" (x64).
Tuyên bố "khóa buýt" này khóa bus để ngăn một CPU khác truy cập vào bus trong khi CPU gọi hoạt động. Bây giờ, hãy xem IL của C# lock()
. Tại đây, bạn sẽ thấy các cuộc gọi đến Monitor
để bắt đầu hoặc kết thúc một phần.
Nói cách khác, câu lệnh .Net lock()
đang hoạt động nhiều hơn .Net Interlocked.Increment
.
SO, nếu tất cả những gì bạn muốn làm là tăng biến, Interlock.Increment
sẽ nhanh hơn. Xem lại tất cả các phương pháp được lồng vào nhau để xem các hoạt động nguyên tử khác nhau có sẵn và để tìm những hoạt động phù hợp với nhu cầu của bạn. Sử dụng lock()
khi bạn muốn thực hiện những điều phức tạp hơn như nhiều lần tăng/giảm liên quan đến nhau hoặc để tuần tự hóa các tài nguyên phức tạp hơn số nguyên.
Upvote để thêm ngữ cảnh – fsimonazzi
-1 cho chi tiết triển khai. Đúng là khóa là chậm hơn so với op nguyên tử, nhưng điều này không liên quan gì đến IL. Các cuộc gọi hàm đó sẽ nhanh hơn một op nguyên tử nếu không phải cho ngữ nghĩa của chúng, vốn không phải là yêu cầu của IL. – Puppy