2008-10-09 94 views

回答

28
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> 
+0

您應該注意,它僅在XP SP3/Win2k3及更高版本中受支持。 – 2008-10-09 20:10:43

+0

Rick有XPSP2的修補程序 http://support.microsoft.com/kb/936235 – stephbu 2008-10-10 03:18:15

2

System.Environment.ProcessorCount是你所需要的

+0

第一次發佈Environment.GetEnvironmentVariable(「NUMBER_OF_PROCESSORS」),但後來我意識到它已經在一個單獨的屬性中解析了。 – 2008-10-09 18:22:27

+0

ProcessorCount返回邏輯處理器數量,而不是物理處理器數量,甚至核心數量。不是OP要求的。 – Conrad 2013-01-31 15:09:45

2

Environment.ProcessorCount

編輯:在.NET 2.0中提供,而不是在.NET邏輯處理器的1.1

+1

但是不返回核心數量。僅限邏輯CPU – stephbu 2008-10-09 18:33:15

3

Environment.ProcessorCount還將包括任何超線程處理器。

有沒有辦法(至少通過Windows 2003)區分超線程處理器和雙核處理器。

+0

不完全正確 - 有幾個服務包可爲XP和Win2k3啓用WMI CPU元數據 – stephbu 2008-10-09 18:31:29

3

實際上,這取決於目標平臺的差異。 Stephbu的答案在XP SP3和更新的版本上效果很好。

如果您針對的是較舊的平臺,則可能需要查看this article。我在半年前寫了這篇文章,並在其中討論了幾種不同的方法來做到這一點,以及每種方法的個人利弊。

如果您有興趣將影子核心與超線程與真實線程區分開來,您可能還想查看this code project article

10

雖然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; 
     } 
    } 
} 
1

您可以使用PowerShell來獲取全面的處理器信息。例如,您可以運行以下命令來獲取CPU核心數量:

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

它更容易研究WMI使用某種資源管理器工具時。因此,我建議您使用WMI瀏覽工具(例如WMIExplorerWMI CIM Studio)來探索WMI類,屬性和方法。