我正在用 C# 编写一个 Windows 应用程序,它本质上是一个多线程的应用程序。但我正在修复中,因为这个应用程序可以在 Celeron/P-IV 系统上运行到 Core i7 系统上。因此,我无法决定如何确定为此应用程序生成的线程数。
有没有办法确定我可以根据用于利用 CPU 的最大功率以及使我的应用程序不滞后/减慢/冻结的处理器产生多少线程?您使用任何一种通用公式吗?
谢谢。
我正在用 C# 编写一个 Windows 应用程序,它本质上是一个多线程的应用程序。但我正在修复中,因为这个应用程序可以在 Celeron/P-IV 系统上运行到 Core i7 系统上。因此,我无法决定如何确定为此应用程序生成的线程数。
有没有办法确定我可以根据用于利用 CPU 的最大功率以及使我的应用程序不滞后/减慢/冻结的处理器产生多少线程?您使用任何一种通用公式吗?
谢谢。
我会考虑使用ThreadPool
. 据我所知,.NET 框架自己管理线程的最佳数量(http://msdn.microsoft.com/en-us/library/0ka9477y.aspx)。
Environment.ProcessorCount
就是你要找的。
对于您问题的第二部分,最好的方法是测试不同数量的线程。这完全取决于您的线程到底在做什么,它们是否花费大量时间阻塞,或者它们可能正在共享公共系统资源,相互访问缓存行,无论如何,所以您不能真正给出这种类型的通用公式事物。这完全取决于您的特定线程行为。
要获得您可以使用的逻辑处理器的数量System.Environment.ProcessorCount
,但是它将与启用超线程的系统上的实际处理器/内核计数不同。要获得更准确的信息,您需要使用 WMI 元数据Win32_ComputerSystem.NumberOfProcessors
和Win32_ComputerSystem.NumberOfLogicalProcessors
.
但是,我建议让系统负责调度并使用高级多线程子系统之一,例如Tasks或ThreadPool