C# 关于多线程启动慢的解决办法-对Task和Parallel均有效

[软件开发] 季雨林 2023/3/29 15:03:00

多线程已经是现在多核cpu结构下必须得用起来的一个开发技术了,无论是有意无意,其实大家都已经体会到多核心的好处了。

但是由于很多人实际并没有用到太多线程,所以有些多线程优化的内容大家并不清楚。最近在项目中被告知预计得准备200个线程,所以我做了些测试,发现了多线程启动慢的问题。

为了解决多线程启动慢问题,花时间试了下多种方案,Task切换Parallel也是相似的结果,启动效率依然不理想。最终在一个预设参数的设置上找到了极好的解决方式。多线程启动慢与当前系统的逻辑处理器数量有直接关系,线程池默认的最小线程数等于当前系统的逻辑内核数量。那就寻找如何设置加大对最小线程的设置值,不再依赖系统自动增加线程的龟速。


线程池的代码如下(含分析过程参数查询):

int minWorkerThreads, minCompletionPortThreads;
int maxWorkerThreads, maxCompletionPortThreads;
ThreadPool.GetMinThreads(out minWorkerThreads, out minCompletionPortThreads);
ThreadPool.GetMaxThreads(out maxWorkerThreads, out maxCompletionPortThreads);
Console.WriteLine("CPU逻辑内核数量:" + Environment.ProcessorCount);
Console.WriteLine("minWorkerThreads:" + minWorkerThreads + ",minCompletionPortThreads" + minCompletionPortThreads);
Console.WriteLine("maxWorkerThreads:" + maxWorkerThreads + ",maxCompletionPortThreads" + maxCompletionPortThreads);
if (!ThreadPool.SetMinThreads(200, 200))
{
Console.WriteLine("设置最小线程值失败!");
}

其实只需要这一行代码:

hreadPool.SetMinThreads(200, 200)


实测效果:

原本200线程在8核cpu上,启动至少需要200-8+1=193秒,如今最小线程数设置200后,直接3秒内启动!



原文地址: https://www.opengps.cn/Blog/View.aspx?id=3049 文章的更新编辑依此链接为准。欢迎关注源站原创文章!

评论

暂无评论!

发表评论:

用于接收作者回复信息
点击更换验证码 - openGPS提示