如何檢測.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