Heim > Backend-Entwicklung > C++ > Wie ermittelt man die Anzahl der physischen, logischen und verfügbaren CPU-Kerne in .NET/C#?

Wie ermittelt man die Anzahl der physischen, logischen und verfügbaren CPU-Kerne in .NET/C#?

Mary-Kate Olsen
Freigeben: 2025-01-18 20:12:12
Original
256 Leute haben es durchsucht

How to Determine the Number of Physical, Logical, and Available CPU Cores in .NET/C#?

Verwenden Sie .NET/C#, um die Anzahl der CPU-Kerne zu ermitteln

Angesichts der zunehmenden Beliebtheit von Multi-Processing ist es entscheidend, die Anzahl der CPU-Kerne für eine optimale Leistung zu bestimmen. In .NET/C# gibt es mehrere Möglichkeiten, auf diese Informationen zuzugreifen:

Physischer Prozessor

Die Anzahl der physischen Prozessoren kann mit dem folgenden Code abgerufen werden:

<code class="language-csharp">foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("物理处理器数量:{0}", item["NumberOfProcessors"]);
}</code>
Nach dem Login kopieren

Kernel

Um die Anzahl der Kerne zu ermitteln, führen Sie den folgenden Code aus:

<code class="language-csharp">int coreCount = 0;
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_Processor").Get())
{
    coreCount += int.Parse(item["NumberOfCores"].ToString());
}
Console.WriteLine("内核数量:{0}", coreCount);</code>
Nach dem Login kopieren

Logischer Prozessor

Die Anzahl der logischen Prozessoren (oft als Hyperthreads bezeichnet) kann mit einem der folgenden Codes ermittelt werden:

<code class="language-csharp">Console.WriteLine("逻辑处理器数量:{0}", Environment.ProcessorCount);</code>
Nach dem Login kopieren
<code class="language-csharp">foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("逻辑处理器数量:{0}", item["NumberOfLogicalProcessors"]);
}</code>
Nach dem Login kopieren

Ausgeschlossene Prozessoren

In einigen Windows-Konfigurationen können bestimmte Prozessoren von der Erkennung ausgeschlossen sein. Dazu können Sie den Windows-API-Aufruf in setupapi.dll verwenden:

<code class="language-csharp">static void Main(string[] args)
{
    int deviceCount = 0;
    IntPtr deviceList = IntPtr.Zero;

    try
    {
        deviceList = SetupDiGetClassDevs(ref processorGuid, "ACPI", IntPtr.Zero, (int)DIGCF.PRESENT);
        for (int deviceNumber = 0; ; deviceNumber++)
        {
            SP_DEVINFO_DATA deviceInfo = new SP_DEVINFO_DATA();
            deviceInfo.cbSize = Marshal.SizeOf(deviceInfo);

            if (!SetupDiEnumDeviceInfo(deviceList, deviceNumber, ref deviceInfo))
            {
                deviceCount = deviceNumber;
                break;
            }
        }
    }
    finally
    {
        if (deviceList != IntPtr.Zero) { SetupDiDestroyDeviceInfoList(deviceList); }
    }
    Console.WriteLine("内核数量:{0}", deviceCount);
}

[DllImport("setupapi.dll", SetLastError = true)]
private static extern IntPtr SetupDiGetClassDevs(ref Guid ClassGuid,
    [MarshalAs(UnmanagedType.LPStr)]String enumerator,
    IntPtr hwndParent,
    Int32 Flags);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern Int32 SetupDiDestroyDeviceInfoList(IntPtr DeviceInfoSet);

[DllImport("setupapi.dll", SetLastError = true)]
private static extern bool SetupDiEnumDeviceInfo(IntPtr DeviceInfoSet,
    Int32 MemberIndex,
    ref SP_DEVINFO_DATA DeviceInterfaceData);

[StructLayout(LayoutKind.Sequential)]
private struct SP_DEVINFO_DATA
{
    public int cbSize;
    public Guid ClassGuid;
    public uint DevInst;
    public IntPtr Reserved;
}

private enum DIGCF
{
    DEFAULT = 0x1,
    PRESENT = 0x2,
    ALLCLASSES = 0x4,
    PROFILE = 0x8,
    DEVICEINTERFACE = 0x10,
}

private static readonly Guid processorGuid = new Guid("{4d36e968-e325-11ce-bfc1-08002be10318}");</code>
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie ermittelt man die Anzahl der physischen, logischen und verfügbaren CPU-Kerne in .NET/C#?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage