如何检测.net中物理处理器/内核的数量?检测处理器数
检测处理器数
回答
System.Environment.ProcessorCount
返回数字
http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx
对于物理处理器数量,您可能需要使用WMI - 在XP/Win2k3以上版本支持以下元数据(在Vista/Win2k8之前在SP中启用的功能)。
Win32_ComputerSystem.NumberOfProcessors返回盘点
Win32_ComputerSystem.NumberOfLogicalProcessors返回逻辑(废话!)
,应谨慎使超线程CPU出现相同multicore'd CPU的尚未表现特点是很不一样。
要检查启用HT的CPU是否检查Win32_Processor的每个实例并比较这两个属性。
Win32_Processor.NumberOfLogicalProcessors
Win32_Processor.NumberOfCores
在多核系统中,这些通常是相同的值。
此外,请注意系统可能有多个处理器组,这在有大量处理器的计算机上经常出现。默认情况下,.Net will only using the first processor group - 这意味着默认情况下,线程将仅使用第一个处理器组中的CPU,并且Environment.ProcessorCount
将仅返回此组中的CPU数量。根据Alastair Maw's answer,这种行为可以通过改变在app.config如下改变:
<configuration>
<runtime>
<Thread_UseAllCpuGroups enabled="true"/>
<GCCpuGroup enabled="true"/>
<gcServer enabled="true"/>
</runtime>
</configuration>
System.Environment.ProcessorCount是你所需要的
第一次发布Environment.GetEnvironmentVariable(“NUMBER_OF_PROCESSORS”),但后来我意识到它已经在一个单独的属性中解析了。 – 2008-10-09 18:22:27
ProcessorCount返回逻辑处理器数量,而不是物理处理器数量,甚至核心数量。不是OP要求的。 – Conrad 2013-01-31 15:09:45
Environment.ProcessorCount
编辑:在.NET 2.0中提供,而不是在.NET逻辑处理器的1.1
但是不返回核心数量。仅限逻辑CPU – stephbu 2008-10-09 18:33:15
Environment.ProcessorCount还将包括任何超线程处理器。
有没有办法(至少通过Windows 2003)区分超线程处理器和双核处理器。
不完全正确 - 有几个服务包可为XP和Win2k3启用WMI CPU元数据 – stephbu 2008-10-09 18:31:29
实际上,这取决于目标平台的差异。 Stephbu的答案在XP SP3和更新的版本上效果很好。
如果您针对的是较旧的平台,则可能需要查看this article。我在半年前写了这篇文章,并在其中讨论了几种不同的方法来做到这一点,以及每种方法的个人利弊。
如果您有兴趣将影子核心与超线程与真实线程区分开来,您可能还想查看this code project article。
虽然Environment.ProcessorCount
确实会为您带来系统中虚拟处理器的数量,这可能不是您的进程可用的处理器数量。我掀起了一个小巧的静态类/属性来获取正是:
using System;
using System.Diagnostics;
/// <summary>
/// Provides a single property which gets the number of processor threads
/// available to the currently executing process.
/// </summary>
internal static class ProcessInfo
{
/// <summary>
/// Gets the number of processors.
/// </summary>
/// <value>The number of processors.</value>
internal static uint NumberOfProcessorThreads
{
get
{
uint processAffinityMask;
using (var currentProcess = Process.GetCurrentProcess())
{
processAffinityMask = (uint)currentProcess.ProcessorAffinity;
}
const uint BitsPerByte = 8;
var loop = BitsPerByte * sizeof(uint);
uint result = 0;
while (--loop > 0)
{
result += processAffinityMask & 1;
processAffinityMask >>= 1;
}
return (result == 0) ? 1 : result;
}
}
}
对于不具备维基足够的代表,但要注意的是,除了XPSP2,Windows 2003 Server的SP1和SP2还需要修补程序启用此功能:
您可以使用PowerShell来获取全面的处理器信息。例如,您可以运行以下命令来获取CPU核心数量:
Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores
它更容易研究WMI使用某种资源管理器工具时。因此,我建议您使用WMI浏览工具(例如WMIExplorer或WMI CIM Studio)来探索WMI类,属性和方法。
- 1. 检测IDLE处理器的数量ruby
- 2. 在预处理器中检测ARM-64?
- 3. 检测iPad的预处理器指令
- 4. 检测空参数在预处理宏
- 5. 检测数字并处理它们?
- 6. 检测Java中处理器数量的平台无关方式
- 7. 物理对象检测器
- 8. 未处理的人脸检测异常
- 9. LibGdx输入处理和碰撞检测
- 10. 散列检测和页面处理
- 11. 检测控件是否被处理
- 12. 打开简历 - 处理 - 检测葡萄
- 13. 检测批处理IP冲突
- 14. 检测/处理查询表失败
- 15. 条形码检测的图像处理
- 16. 注意检测与处理和最小
- 17. IOS声音处理,电平检测
- 18. 正方形检测,图像处理
- 19. Android图像处理和模式检测
- 20. 图像处理中的边缘检测
- 21. TensorFlow视频处理,更改检测
- 22. 图像处理中的形状检测
- 23. 处理颜色碰撞检测(java)
- 24. 骆驼“组成消息处理器”如何检测“onComplete”
- 25. 如何检测类型是C中预处理器的指针?
- 26. 以编程方式检测处理器类型(Linux)
- 27. 检测预处理器中的MOVBE可用性?
- 28. 如何在批处理文件中检测多个监视器
- 29. 在J2ME项目中未检测到预处理器块(Netbeans 6.9.1)
- 30. 手势检测器无法处理新布局
您应该注意,它仅在XP SP3/Win2k3及更高版本中受支持。 – 2008-10-09 20:10:43
Rick有XPSP2的修补程序 http://support.microsoft.com/kb/936235 – stephbu 2008-10-10 03:18:15