У меня есть приложение с интенсивным процессором. Когда данные обрабатываются в одном потоке, использование ЦП длится 100% в течение многих минут. Таким образом, производительность приложения, по-видимому, связана с процессором. Я многократно продиктовал логику приложения, что привело к увеличению общей производительности. Однако использование ЦП почти не превышает 30% -50%. Я бы ожидал, что CPU (и многие ядра) перейдут на 100%, поскольку я обрабатываю много данных одновременно.
Ниже приведен упрощенный пример логики, которую я использую для запуска потоков. Когда я запускаю этот пример, процессор переходит на 100% (на 8/16 ядерную машину). Однако мое приложение, которое использует тот же шаблон, не делает.
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();
}
Я сократил количество блокировок до строгого минимума (только защелка блокируется). Лучший способ, который я нашел, - создать контекст, в котором поток может читать/записывать в память. Контексты не распространяются среди других потоков. Нитки не могут получить доступ к базе данных, файлам или сети. Другими словами, я профилировал свое приложение, и я не нашел узкого места.
Почему использование процессора моим приложением не превышает 50%? Я использую шаблон? Должен ли я создать свой собственный поток вместо использования пула потоков .Net? Есть ли какие-то ошибки? Есть ли какой-нибудь инструмент, который вы могли бы рекомендовать мне найти мою проблему?
Спасибо!