多线程已经是现在多核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
文章的更新编辑依此链接为准。欢迎关注源站原创文章!