Tôi có một ứng dụng là CPU chuyên sâu. Khi dữ liệu được xử lý trên một chủ đề duy nhất, việc sử dụng CPU sẽ tới 100% trong nhiều phút. Vì vậy, hiệu suất của ứng dụng dường như bị ràng buộc bởi CPU. Tôi đã đa luồng logic của ứng dụng, dẫn đến tăng hiệu suất tổng thể. Tuy nhiên, việc sử dụng CPU hầu như không vượt quá 30% -50%. Tôi mong đợi CPU (và nhiều lõi) đi đến 100% vì tôi xử lý nhiều tập hợp dữ liệu cùng một lúc.Lý do tại sao việc sử dụng CPU không đạt 100% với C# và APM là gì?
Dưới đây là ví dụ đơn giản về logic mà tôi sử dụng để bắt đầu chuỗi. Khi tôi chạy ví dụ này, CPU đi đến 100% (trên một máy lõi 8/16). Tuy nhiên, ứng dụng của tôi sử dụng cùng một mẫu thì không.
public class DataExecutionContext
{
public int Counter { get; set; }
// Arrays of data
}
static void Main(string[] args)
{
// Load data from the database into the context
var contexts = new List<DataExecutionContext>(100);
for (int i = 0; i < 100; i++)
{
contexts.Add(new DataExecutionContext());
}
// Data loaded. Start to process.
var latch = new CountdownEvent(contexts.Count);
var processData = new Action<DataExecutionContext>(c =>
{
// The thread doesn't access data from a DB, file,
// network, etc. It reads and write data in RAM only
// (in its context).
for (int i = 0; i < 100000000; i++)
c.Counter++;
});
foreach (var context in contexts)
{
processData.BeginInvoke(context, new AsyncCallback(ar =>
{
latch.Signal();
}), null);
}
latch.Wait();
}
Tôi đã giảm số lượng khóa xuống mức tối thiểu nghiêm ngặt (chỉ chốt đang khóa). Cách tốt nhất tôi tìm thấy là tạo ra một bối cảnh trong đó một luồng có thể đọc/ghi trong bộ nhớ. Các ngữ cảnh không được chia sẻ giữa các chủ đề khác. Chủ đề không thể truy cập cơ sở dữ liệu, tệp hoặc mạng. Nói cách khác, tôi đã lược tả đơn đăng ký của mình và tôi không tìm thấy bất kỳ nút cổ chai nào.
Tại sao việc sử dụng CPU của ứng dụng của tôi không giảm khoảng 50%? Đó có phải là mẫu tôi sử dụng không? Tôi có nên tạo chủ đề của riêng mình thay vì sử dụng hồ bơi chuỗi .Net không? Có gotchas nào không? Có công cụ nào mà bạn có thể giới thiệu cho tôi để tìm sự cố của tôi không?
Cảm ơn!
Có thể, nhưng khá khó xảy ra sẽ là mã của bạn được kích hoạt một rất nhiều bộ sưu tập rác, đòi hỏi một số lượng đồng bộ hóa. –