你如何测量的物理处理器/核心。净?

有帮助吗?

解决方案

System.Environment.ProcessorCount

返回人数的逻辑处理器

http://msdn.microsoft.com/en-us/library/system.environment.processorcount.aspx

对于物理处理器计你可能需要使用WMI下列元数据的支持XP/Win2k3上(启用的功能在SP的前Vista/Win2k8).

Win32_ComputerSystem.NumberOfProcessors 返回的物理计数

Win32_ComputerSystem.NumberOfLogicalProcessors 返回的逻辑(废话!)

谨慎,超线程Cpu出现相同的至多会CPU是的性能特征 非常 不同。

检查HT启用Cpu审查每个实例的Win32_Processor和比较这两个属性。

Win32_Processor.NumberOfLogicalProcessors

Win32_Processor.NumberOfCores

在多核系统,这些通常是相同的价值。

此外,应注意的系统,可能有多重 处理器组, ,这是经常看到的计算机上有大量处理器。通过默认 .净将只采用第一组处理器 -这意味着默认情况下,线将利用仅Cpu从第一个处理器组, Environment.ProcessorCount 将只返回的数量Cpu在这个小组。根据 阿拉斯泰尔*Maw的答案, 此行为可以通过改变改变的程序。配置如下:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

其他提示

虽然 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;
        }
    }
}

Environment.ProcessorCount还将包含任何超线程处理器。

没有办法(至少通过Windows 2003)将超线程处理器与具有两个核心的处理器区分开来。

这实际上根据目标平台的不同而有所不同。 Stephbu的答案将在XP SP3和更新版本上运行良好。

如果您要定位较旧的平台,可能需要查看这篇文章。我大约半年前写过它,在其中我讨论了几种不同的方法,以及每种方法的个别优缺点。

您可能还想查看此代码项目文章有兴趣区分影子核心和超线程与真实核心。

System.Environment.ProcessorCount是您需要的

Environment.ProcessorCount

编辑:在.NET 2.0中提供,而不是在.NET 1.1中提供

没有足够的wiki代表,但请注意,除了XPSP2之外,Windows 2003 Server SP1和SP2还需要一个修补程序才能启用此功能:

http://support.microsoft.com/kb/932370

您可以使用PowerShell访问全面的处理器信息。例如,您可以运行以下命令来获取CPU核心数:

Get-WmiObject -namespace root\CIMV2 -class Win32_Processor -Property NumberOfCores

使用某种浏览器工具时,研究WMI要容易得多。所以,我建议使用WMI浏览工具(例如 WMIExplorer WMI CIM Studio )探索WMI类,属性和方法。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top