Để có hiệu suất cao nhất với các đơn vị thực thi đồng thời, hãy viết nhóm luồng của riêng bạn, trong đó nhóm đối tượng Thread được tạo khi khởi động và chuyển sang chặn (trước đây bị treo), chờ trên ngữ cảnh để chạy (một đối tượng có giao diện chuẩn được triển khai bởi ma cua ban).
Vì vậy, nhiều bài viết về Nhiệm vụ so với Chủ đề so với .NET ThreadPool không thực sự cung cấp cho bạn những gì bạn cần để đưa ra quyết định về hiệu suất. Nhưng khi bạn so sánh chúng, Chủ đề thắng và đặc biệt là nhóm Chủ đề. Chúng được phân phối tốt nhất trên các CPU và chúng khởi động nhanh hơn.
Điều cần thảo luận là thực tế rằng đơn vị thực thi chính của Windows (bao gồm cả Windows 10) là một luồng và chi phí chuyển đổi bối cảnh của hệ điều hành thường không đáng kể. Nói một cách đơn giản, tôi không thể tìm thấy bằng chứng thuyết phục về nhiều bài viết này, cho dù bài viết có yêu cầu hiệu suất cao hơn bằng cách lưu chuyển đổi ngữ cảnh hoặc sử dụng CPU tốt hơn.
Bây giờ cho một chút hiện thực:
Hầu hết chúng ta sẽ không cần ứng dụng của mình mang tính quyết định và hầu hết chúng ta không có nền tảng khó khăn với các luồng, ví dụ, thường đi kèm với việc phát triển một hệ điều hành. Những gì tôi viết ở trên không dành cho người mới bắt đầu.
Vì vậy, những gì có thể quan trọng nhất là thảo luận là những gì dễ lập trình.
Nếu bạn tạo nhóm luồng của riêng mình, bạn sẽ có một chút văn bản để làm vì bạn cần quan tâm đến việc theo dõi trạng thái thực thi, cách mô phỏng tạm dừng và tiếp tục và cách hủy thực thi - bao gồm trong toàn ứng dụng tắt. Bạn cũng có thể phải quan tâm đến việc bạn có muốn tự động phát triển hồ bơi của mình hay không và giới hạn khả năng của hồ bơi của bạn là gì. Tôi có thể viết một khung như vậy trong một giờ nhưng đó là vì tôi đã thực hiện nó rất nhiều lần.
Có lẽ cách dễ nhất để viết một đơn vị thực thi là sử dụng Tác vụ. Vẻ đẹp của Nhiệm vụ là bạn có thể tạo một nhiệm vụ và khởi động nó trong dòng mã của mình (mặc dù có thể cần thận trọng). Bạn có thể chuyển mã thông báo hủy để xử lý khi bạn muốn hủy Tác vụ. Ngoài ra, nó sử dụng cách tiếp cận lời hứa để xâu chuỗi các sự kiện và bạn có thể yêu cầu nó trả về một loại giá trị cụ thể. Hơn nữa, với async và đang chờ, sẽ có nhiều tùy chọn hơn và mã của bạn sẽ dễ mang theo hơn.
Về bản chất, điều quan trọng là phải hiểu những ưu và nhược điểm với Nhiệm vụ so với Chủ đề so với .NET ThreadPool. Nếu tôi cần hiệu suất cao, tôi sẽ sử dụng các chủ đề, và tôi thích sử dụng nhóm của riêng tôi.
Một cách dễ dàng để so sánh là khởi động 512 Chủ đề, 512 Nhiệm vụ và 512 Chủ đề ThreadPool. Bạn sẽ thấy sự chậm trễ khi bắt đầu với Chủ đề (do đó, tại sao lại viết một nhóm chủ đề), nhưng tất cả 512 Chủ đề sẽ chạy trong vài giây trong khi các chủ đề Nhiệm vụ và .NET ThreadPool mất đến vài phút để bắt đầu.
Dưới đây là kết quả của một thử nghiệm như vậy (i5 lõi tứ với 16 GB RAM), cho mỗi 30 giây để chạy. Mã được thực thi thực hiện I / O tệp đơn giản trên ổ SSD.
Kết quả kiểm tra