Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menentukan Bilangan Teras CPU Fizikal, Logik dan Tersedia dalam .NET/C#?

Bagaimana untuk Menentukan Bilangan Teras CPU Fizikal, Logik dan Tersedia dalam .NET/C#?

Mary-Kate Olsen
Lepaskan: 2025-01-18 20:12:12
asal
285 orang telah melayarinya

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

Gunakan .NET/C# untuk mengesan bilangan teras CPU

Dengan peningkatan populariti berbilang pemprosesan, adalah penting untuk menentukan bilangan teras CPU untuk prestasi optimum. Dalam .NET/C#, terdapat beberapa cara untuk mengakses maklumat ini:

Pemproses Fizikal

Bilangan pemproses fizikal boleh diambil menggunakan kod berikut:

foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("物理处理器数量:{0}", item["NumberOfProcessors"]);
}
Salin selepas log masuk

Kernel

Untuk menentukan bilangan teras, laksanakan kod berikut:

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);
Salin selepas log masuk

Pemproses Logik

Bilangan pemproses logik (sering dipanggil hyperthreads) boleh diperoleh menggunakan salah satu daripada kod berikut:

Console.WriteLine("逻辑处理器数量:{0}", Environment.ProcessorCount);
Salin selepas log masuk
foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get())
{
    Console.WriteLine("逻辑处理器数量:{0}", item["NumberOfLogicalProcessors"]);
}
Salin selepas log masuk

Pemproses Dikecualikan

Dalam sesetengah konfigurasi Windows, pemproses tertentu mungkin dikecualikan daripada pengesanan. Untuk melakukan ini, anda boleh menggunakan panggilan API Windows yang terdapat dalam setupapi.dll:

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}");
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menentukan Bilangan Teras CPU Fizikal, Logik dan Tersedia dalam .NET/C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan