Tại sao chia sẻ hiệu suất nhà nước xuống cấp?


19

Tôi đã làm việc theo nguyên tắc chia sẻ không có gì của lập trình đồng thời. Về cơ bản, tất cả các luồng công nhân của tôi có các bản sao chỉ đọc bất biến của cùng một trạng thái không bao giờ được chia sẻ giữa chúng ( ngay cả bằng cách tham chiếu ). Nói chung, điều này đã làm việc thực sự tốt.

Bây giờ, ai đó đã giới thiệu bộ đệm đơn không khóa ( ví dụ: từ điển tĩnh ) mà tất cả các luồng đang truy cập đồng thời. Vì từ điển không bao giờ bị thay đổi sau khi khởi động nên không có khóa. Không có bất kỳ vấn đề An toàn chủ đề nào, nhưng bây giờ có sự suy giảm hiệu suất.

Câu hỏi là ... vì không có khóa tại sao việc giới thiệu singleton này lại tạo ra một màn trình diễn thành công? Chính xác thì chuyện gì đang diễn ra dưới vỏ bọc có thể giải thích điều này?

Để xác nhận, truy cập singleton mới này là thay đổi duy nhất và tôi có thể tạo lại nó một cách đáng tin cậy chỉ bằng cách nhận xét cuộc gọi đến bộ đệm.


8
Bạn đã chỉ một hồ sơ tại mã?
Timo Geusch

2
Hồ sơ không có khả năng trả lời câu hỏi này trừ khi bạn định hình CLR và có thể là nhân windows (không phải là một nhiệm vụ dễ dàng đối với lập trình viên trung bình).
Igby Largeeman

1
@JoeGeeky Được rồi, tôi đoán điều duy nhất cần làm cho tôi ở đây là +1 và ủng hộ! Rốt cuộc có vẻ kỳ lạ vì cả hai đều ở cùng một mức độ gián tiếp, và dù sao cũng phải phù hợp với bộ đệm của bộ xử lý, v.v ...
Tối đa

2
FWIT Tôi sinh ra một vài chủ đề và chạy một số bộ tính giờ. Tôi đã khởi tạo một lớp, singleton, lockSingleton và dict <chuỗi, chuỗi>. Sau lần khởi tạo đầu tiên của mỗi lần, các lần chạy liên tiếp mất khoảng 2000ns cho bất kỳ đối tượng nào. Từ điển chạy chậm hơn 2 lần, có thể là do mã xây dựng ... nó chậm hơn khóa. Xem xét tất cả các GC, hệ điều hành xử lý hàng đợi luồng và các chi phí khác ... không chắc ai có thể thực sự trả lời câu hỏi này. Nhưng, từ kết quả của tôi, tôi không tin rằng vấn đề liên quan đến Singletons. Không, nếu nó được triển khai như trên MSDN. Ngoại trừ tối ưu hóa trình biên dịch.
P.Brian.Mackey

1
@JoeGeeky - một suy nghĩ khác: việc sử dụng bộ đệm có thêm một mức độ không xác định? Nếu thường xuyên truy cập, theo đuổi một con trỏ phụ deref (hoặc MSIL Equiv) có thể thêm một chút thời gian trên một bản sao ít gián tiếp cục bộ.
sdg

Câu trả lời:


8

Nó có thể là trạng thái bất biến chia sẻ một dòng bộ đệm với một cái gì đó có thể thay đổi. Trong trường hợp này, một sự thay đổi về trạng thái có thể thay đổi gần đó có thể có tác dụng buộc phải nối lại dòng bộ đệm này trên các lõi, điều này có thể làm chậm hiệu suất.


3
Điều này nghe có vẻ như một false sharingkịch bản mà bạn mô tả. Để cô lập rằng tôi cần phải cấu hình L2 Cache. Thật không may, đây là các loại tham chiếu vì vậy việc thêm không gian bộ đệm sẽ không phải là một tùy chọn nếu đây thực sự là những gì đang xảy ra.
JoeGeeky

3

Tôi sẽ đảm bảo rằng Equals()GetHashCode()các phương thức của các đối tượng bạn sử dụng làm khóa cho từ điển không có bất kỳ tác dụng phụ không thân thiện bất ngờ nào. Hồ sơ sẽ giúp rất nhiều ở đây.

Nếu có bất kỳ khóa nào, khóa của bạn là chuỗi, thì có lẽ bạn đã có nó: có tin đồn rằng chuỗi đó hoạt động như các đối tượng bất biến nhưng vì lợi ích của một số tối ưu hóa, chúng được thực hiện theo cách có thể thay đổi, với mọi thứ mà điều này đòi hỏi phải đa luồng .

Tôi sẽ thử chuyển từ điển cho các chủ đề sử dụng nó như một tài liệu tham khảo thông thường thay vì một đơn để xem liệu vấn đề nằm ở sự chia sẻ hay với tính đơn lẻ của từ điển. (Loại bỏ các nguyên nhân có thể.)

Tôi cũng sẽ thử với một ConcurrentDictionarythay vì thông thường Dictionarychỉ trong trường hợp việc sử dụng nó mang lại một số kết quả đáng ngạc nhiên. Có rất nhiều điều cần được suy đoán về vấn đề trong tay nếu một người ConcurrentDictionarythực hiện tốt hơn hoặc kém hơn nhiều so với thông thường của bạn Dictionary.

Nếu không có vấn đề nào ở trên chỉ ra vấn đề, thì tôi đoán rằng hiệu suất bị suy giảm là do một sự tranh chấp kỳ lạ giữa luồng thu gom rác và phần còn lại của các luồng của bạn, vì trình thu gom rác đang cố gắng tìm hiểu xem các đối tượng trong từ điển của bạn cần phải được xử lý hay không, trong khi chúng đang được truy cập bởi các chủ đề của bạn.

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.