让我们说我已经创建了许多线程(~100)并且我已经让大部分线程处于休眠状态,而其中一些线程正处理纯粹的CPU绑定问题。 JUST创建少数正在工作的线程而没有正在睡眠的线程,对性能的影响是什么?许多线程的存在,无论它们是否正在休眠,都会因为所有上下文切换而显着降低性能,或者睡眠线程在很大程度上被忽略而且CPU主要在活动线程之间划分?
我不是在寻找像“50%性能下降”这样的答案,我只是想更详细地了解睡眠线程如何影响其他线程可用的cpu。
答案 0 :(得分:4)
根据.net标签,我假设您正在处理Windows上的线程。
至少在正常的Windows调度程序的情况下,睡眠线程通常会极少地影响性能。
线程将消耗一些资源 - 例如,您创建的每个线程都有自己的堆栈,线程信息块等。创建线程时会占用一些内存和CPU时间。如果你的内存不足,可以将内存分页,这需要更多的时间(CPU时间,内存和I / O带宽等)
但是,一旦线程处于休眠状态,它通常不会持续消耗CPU时间。
与此同时,这听起来像一个非常糟糕的设计。您通常需要一个相当小的线程池,而只是提交由这些线程执行的任务,而不是创建大量花费大部分时间休眠的线程。这节省了创建线程的时间,减少了内存使用,清理了设计,并且更容易利用不同的处理器资源(例如,如果您有更多处理器,则增加线程池大小)。
答案 1 :(得分:1)
“运行”以外的任何状态的线程都没有运行。 'Ready'线程可以运行并等待处理器可用。上下文更改只能在正在运行的线程和就绪线程之间发生。
像Nathan所说的那样 - 没有上下文切换到睡眠线程。
也就是说,如果你用数以千计的睡眠线程膨胀OS系统状态,那么调度/调度可能会有一些轻微的,可测量的增加,所以我不想说没有任何影响,只是那里与99.999%的申请无关。
您可以轻松编写测试代码。在循环中创建1000个睡眠(INFINITE)线程,然后保留它们。用你的盒子。在渲染网页时,Firefox看起来有什么不同吗? uTorrent慢了吗?使用Excel制作一个可怕的大型电子表格,以便使用秒表测量重新计算时间。额外的1000个线程在睡觉时速度会慢吗?
现在系统上加载了多少个线程?我的任务管理器/性能说1195.其中大多数都没有运行,因为CPU使用率为0-1%。我的盒子运转得很好。
RGDS, 马丁
答案 2 :(得分:0)
我的建议是缩减线程数量,并让一些线程为您完成工作。听起来你正在使用像类实例这样的线程,而不是像工人一样。每次创建线程时,都会占用一些资源。当然,在当今快速CPU和大量内存的时代,这并不是很多,但它仍然是一个问题。
这是关于线程池的一篇不错的文章,它也回答了你的问题:
http://www.theukwebdesigncompany.com/articles/iocp-thread-pooling.php
我建议您使用较少的线程,或者利用.NET 4.0的新线程功能,这些功能真正彻底改变了应用程序中的线程。