Tôi có một phương pháp trong thuật toán của mình chạy một vòng lặp rất chặt chẽ trên một tập dữ liệu rất lớn. Ban đầu tôi viết nó là một luồng đơn, nhưng nó mất một thời gian dài. Tôi đến mức muốn tăng tốc nó, vì vậy bây giờ tôi đang sử dụng ThreadPool để song song công việc. Vấn đề là điều này gây ra việc sử dụng CPU của tôi để đi đến 95-100%, mà tôi sắp xếp của dự kiến. Tuy nhiên, hiệu suất của tôi đã tăng lên đáng kể, nhưng tôi nghĩ rằng tôi có thể làm cho nó tốt hơn nếu tôi có thể cắt giảm tất cả các bối cảnh chuyển đổi. Điều này cũng khiến các chương trình khác của tôi hơi bị lag vì chúng phải chống lại các luồng cho tài nguyên CPU.Gọi lại ThreadPool trong vòng lặp chặt chẽ - 100% CPU
Câu hỏi của tôi là làm cách nào để tôi thực hiện việc này? Điều duy nhất tôi đã có thể nghĩ đến là giới hạn số lượng chủ đề đang chạy cùng một lúc, nhưng điều này có thể làm cho thuật toán của tôi chậm hơn vì chỉ một vài chuỗi sẽ có thể chạy cùng một lúc. Tôi không muốn thêm vào giấc ngủ trong chủ đề của mình vì tôi chỉ cần thuật toán chạy để hoàn thành càng nhanh càng tốt.
EDIT: Một số người đã đề cập sử dụng TPL. Tôi nghĩ rằng đó là một ý tưởng tuyệt vời, nhưng tiếc là tôi quên đề cập đến rằng tôi đang bị mắc kẹt bằng cách sử dụng .NET 3.5 kể từ khi ứng dụng cha mẹ đã không phát hành một phiên bản bằng cách sử dụng .NET 4 được nêu ra.
Nếu bạn muốn tốc độ, tại sao bạn sẽ loại bỏ tất cả những thứ tăng tốc? Chuyển đổi ngữ cảnh được thực hiện bởi hệ điều hành, bạn không gây rối với điều đó ... – gbianchi
Giải pháp là giảm ưu tiên của các chủ đề trong hồ bơi. Đây không phải là một câu trả lời bởi vì tôi không biết làm thế nào để làm điều đó một cách hiệu quả: ( –
Âm thanh như bạn nên làm cho các nhiệm vụ cá nhân lớn hơn. OTOH, threadpool là đủ thông minh để đã làm hầu hết những gì bạn đề nghị. hơn so với CPU, nó sẽ xếp hàng chúng thay vì bắt đầu nhiều chủ đề hơn –