【发布时间】:2010-02-23 18:13:35
【问题描述】:
我有一个 CPU 密集型应用程序。在单个线程上处理数据时,CPU 使用率会持续数分钟达到 100%。因此,应用程序的性能似乎受到 CPU 的约束。我对应用程序的逻辑进行了多线程处理,从而提高了整体性能。但是,CPU 使用率几乎不会超过 30%-50%。我希望 CPU(和许多内核)达到 100%,因为我同时处理许多数据集。
下面是我用来启动线程的逻辑的简化示例。当我运行这个示例时,CPU 达到 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();
}
我已将锁的数量减少到严格的最小值(只有闩锁处于锁定状态)。我发现最好的方法是创建一个线程可以在内存中读/写的上下文。上下文不在其他线程之间共享。线程无法访问数据库、文件或网络。换句话说,我分析了我的应用程序,但没有发现任何瓶颈。
为什么我的应用程序的 CPU 使用率没有达到 50% 左右?是我使用的模式吗?我应该创建自己的线程而不是使用 .Net 线程池吗?有什么陷阱吗?有什么工具可以推荐给我来查找我的问题吗?
谢谢!
【问题讨论】:
-
可能,但不太可能是您的代码触发了大量垃圾收集,这需要一定程度的同步。
标签: c# .net multithreading asynchronous