Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Menentukan Bilangan Teras CPU Fizikal, Logik dan Tersedia dalam .NET/C#?
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:
Bilangan pemproses fizikal boleh diambil menggunakan kod berikut:
<code class="language-csharp">foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) { Console.WriteLine("物理处理器数量:{0}", item["NumberOfProcessors"]); }</code>
Untuk menentukan bilangan teras, laksanakan kod berikut:
<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>
Bilangan pemproses logik (sering dipanggil hyperthreads) boleh diperoleh menggunakan salah satu daripada kod berikut:
<code class="language-csharp">Console.WriteLine("逻辑处理器数量:{0}", Environment.ProcessorCount);</code>
<code class="language-csharp">foreach (var item in new System.Management.ManagementObjectSearcher("Select * from Win32_ComputerSystem").Get()) { Console.WriteLine("逻辑处理器数量:{0}", item["NumberOfLogicalProcessors"]); }</code>
Dalam sesetengah konfigurasi Windows, pemproses tertentu mungkin dikecualikan daripada pengesanan. Untuk melakukan ini, anda boleh menggunakan panggilan API Windows yang terdapat dalam setupapi.dll:
<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>
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!