C#多线程代码中的高CPU使用率
本文关键字:CPU 使用率 多线程 代码 | 更新日期: 2023-09-27 18:21:28
我对编写好的多线程代码没有太多知识。我最近刚开始做一个必要的项目。我已经写了下面的代码,它按照我想要的方式工作,然而,CPU使用率非常高。我认为这是由于我使用线程的方式。如果有人能指出下面代码中的缺陷,并让我知道如何修复它,这样CPU使用率就不会那么高,我将非常感激
var numberOfMinutes = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfMinutesToRun"]);
var traversals = DbLayer.GetTraversals().ToList();
var numberOfThreads = Convert.ToInt32(ConfigurationManager.AppSettings["NumberOfThreads"]);
var threads = new List<Thread>(numberOfThreads);
var counter = 1;
var s = new Stopwatch();
s.Start();
var sync = new object();
while (s.Elapsed < TimeSpan.FromMinutes(numberOfMinutes))
{
for (var i = 0; i < (numberOfThreads - threads.Count); i++)
{
var counter1 = counter; // due to closure.
var traversal = traversals.FirstOrDefault(t => t.Id == counter1);
var threadStart = new ThreadStart(new CallHelper(traversal).Migrate);
var i1 = i;
threadStart += () =>
{
threads.RemoveAt(i1);
};
threads.Insert(i, new Thread(threadStart) {IsBackground = true});
threads[i].Start();
lock (sync)
{
counter++;
if (counter > 6)
{
counter = 1;
}
}
}
}
s.Stop();
我更新了代码以显示我所希望的帮助。traversals集合只包含6个项目。计数器用于确保线程在遍历集合中的6个项目中的每一个项目中旋转。CallHelper类只是在每次遍历中执行一个运行时间很长的任务。该应用程序旨在使用可配置数量的线程在可配置的时间内对6个不同的对象执行长时间运行的任务。希望我已经填够了空白。
在线上有各种资源可用于编写良好高效的多线程代码。"好"通常指的是可工作且健壮的代码。为了获得高效的代码,请使用嵌入式资源。
我只扫描了你的代码,但可以看到各种问题,并可以提供建议。
- 使用线程池。构建和拆除线程是非常昂贵的
- 尽可能不频繁地重复循环(如上所述)
- 在需要延迟时使用睡眠和非繁忙循环
- 使用非琐碎的代码来测试效率。如果您是针对琐碎的代码进行测试,那么您的利用率将由程序(而不仅仅是线程)的设置和拆卸来控制,这是非常昂贵的,并且将主导cpu利用率
- 衡量您感兴趣的代码的利用率,并排除不感兴趣的部分,例如应用程序的设置和拆卸