Frage

Wie erkennen Sie die Anzahl der physischen Prozessoren / Kerne in .net?

War es hilfreich?

Lösung

System.Environment.ProcessorCount

gibt die Anzahl der logischen Prozessoren

  

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

Für physische Prozessoranzahl würden Sie wahrscheinlich brauchen WMI zu verwenden -. Die folgenden Metadaten in XP unterstützt werden / Win2k3 nach oben (Funktionalität aktiviert in SPs vor Vista / Win2k8)

  

Win32_ComputerSystem.NumberOfProcessors liefert physikalische Zahl

     

Win32_ComputerSystem.NumberOfLogicalProcessors liefert logische (duh!)

Seien Sie vorsichtig, dass HyperThreaded CPUs identisch erscheinen CPUs multicore'd noch die Leistungsmerkmale sind sehr anders.

Um zu überprüfen, für HT-fähigen CPUs jede Instanz Win32_Processor untersuchen und vergleichen Sie diese beiden Eigenschaften.

  

Win32_Processor.NumberOfLogicalProcessors

     

Win32_Processor.NumberOfCores

Auf Multi-Core-Systemen diese sind in der Regel der gleiche Wert.

Beachten Sie auch, von Systemen, die mehr Prozessorgruppen , die mit einer großen Anzahl von Prozessoren auf Computer zu sehen ist oft haben können. Standardmäßig .Net wird nur unter Verwendung der ersten Prozessorgruppe - was bedeutet, dass standardmäßig, werden Threads nur CPUs von der ersten Prozessorgruppe verwenden und Environment.ProcessorCount wird nur die Anzahl der CPUs in dieser Gruppe zurück. Nach Alastair Maw Antwort dieses Verhalten kann durch Veränderung der app.config wie folgt geändert werden:

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

Andere Tipps

Während Environment.ProcessorCount wird in der Tat erhalten Sie die Anzahl der virtuellen Prozessoren im System, die nicht die Anzahl der Prozessoren an Ihren Prozess zur Verfügung stehen. Ich peitschte ein schnelles kleines statische Klasse / Objekt bis zu bekommen genau das:

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 werden auch alle mit Hyper-Threading-Prozessoren enthalten.

Es gibt keine Möglichkeit (zumindest bis über die Windows 2003) einen Hyper-Threading-Prozessor von einem mit zwei Kernen zu unterscheiden.

Dies variiert tatsächlich ziemlich viel abhängig von der Zielplattform. Stephbu Antwort wird große Arbeit auf XP SP3 und höher.

Wenn Sie ältere Plattformen zielen, können Sie ein href überprüfen <= "http://www.atalasoft.com/cs/blogs/rickm/archive/2008/04/01/counting-processors-in -Netz-the-Profis-und-Wider-of-five-andere-methods.aspx“rel = "nofollow noreferrer"> dieser Artikel . Ich schrieb es etwa ein halbes Jahr vor und es ich verschiedene Möglichkeiten diskutieren diese sowie die einzelnen Vor- und Nachteile der einzelnen Methoden zu tun.

Sie können auch diesem Code Projekt Artikel zu überprüfen, wenn Sie Interesse Schatten Kerne von Hyperthreading von echten zu unterscheiden.

System.Environment.ProcessorCount ist, was Sie brauchen

Environment.ProcessorCount

EDIT: in .NET 2.0, nicht in .NET 1.1

haben nicht genug rep für das Wiki, aber beachten, dass zusätzlich zu XPSP2, Windows 2003 Server SP1 und SP2 benötigen auch einen Hotfix diese Funktionalität zu aktivieren:

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

Sie können die Powershell verwenden umfassende Prozessor Informationen zuzugreifen. Beispielsweise können Sie den folgenden Befehl ausführen, um die Anzahl der CPU-Kerne zu erhalten:

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

Es ist viel einfacher WMI zu erforschen, wenn irgendeine Art von Explorer-Tool. So kann ich vorschlagen, WMI-Browsing-Tool (zB WMIExplorer oder WMI CIM Studio ) zu WMI-Klassen, Eigenschaften und Methoden zu erforschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top