Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

วิธีหาจำนวน CPU Cores ใน C#

การตรวจสอบข้อมูล CPU ใน C#

ข้อมูล CPU มีหลายระดับที่แตกต่างกัน:

  • Physical Processors (Sockets) - จำนวน CPU ตัวจริงบนเมนบอร์ด
  • Cores - จำนวนโคร์ทั้งหมด (Physical processors × cores per processor)
  • Logical Processors - จำนวน thread ที่ CPU รองรับ (รวม Hyper-threading)

ตัวอย่าง: CPU 2 ตัว แต่ละตัว 4 โคร์ รองรับ Hyper-threading → 2 Sockets, 8 Cores, 16 Logical Processors

1. Logical Processors (ง่ายที่สุด - ไม่ต้องเพิ่ม reference)

using System;

class Program
{
    public static void Main()
    {
        int logicalCount = Environment.ProcessorCount;
        Console.WriteLine($"Logical Processors: {logicalCount}");
    }
}

ผลลัพธ์ตัวอย่าง: Logical Processors: 8

2. Physical Processors และ Cores (ต้องใช้ WMI - Windows เท่านั้น)

ต้องเพิ่ม reference: System.Management.dll (.NET Framework) หรือ NuGet: System.Management (.NET Core/5+ Windows only)

Physical Processors (Sockets)

using System;
using System.Management;

class Program
{
    public static void Main()
    {
        try
        {
            var searcher = new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem");
            foreach (ManagementObject obj in searcher.Get())
            {
                Console.WriteLine($"Physical Processors (Sockets): {obj["NumberOfProcessors"]}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

Cores (รวมทุก Socket)

using System;
using System.Management;

class Program
{
    public static void Main()
    {
        try
        {
            int coreCount = 0;
            var searcher = new ManagementObjectSearcher("SELECT NumberOfCores FROM Win32_Processor");
            foreach (ManagementObject obj in searcher.Get())
            {
                coreCount += Convert.ToInt32(obj["NumberOfCores"]);
            }
            Console.WriteLine($"Total Cores: {coreCount}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }
    }
}

3. รวมทั้งหมดในโค้ดเดียว

using System;
using System.Management;

class Program
{
    public static void Main()
    {
        Console.WriteLine($"Logical Processors: {Environment.ProcessorCount}");
        
        try
        {
            // Physical Processors
            var csSearcher = new ManagementObjectSearcher("SELECT NumberOfProcessors FROM Win32_ComputerSystem");
            foreach (ManagementObject obj in csSearcher.Get())
            {
                Console.WriteLine($"Physical Processors: {obj["NumberOfProcessors"]}");
            }
            
            // Cores
            int cores = 0;
            var procSearcher = new ManagementObjectSearcher("SELECT NumberOfCores, NumberOfLogicalProcessors FROM Win32_Processor");
            foreach (ManagementObject obj in procSearcher.Get())
            {
                cores += Convert.ToInt32(obj["NumberOfCores"]);
                Console.WriteLine($"Logical Processors (per CPU): {obj["NumberOfLogicalProcessors"]}");
            }
            Console.WriteLine($"Total Cores: {cores}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"WMI Error: {ex.Message}");
            Console.WriteLine("หมายเหตุ: WMI ต้องการ Windows และอาจต้องการสิทธิ์ Admin");
        }
    }
}

ผลลัพธ์ตัวอย่าง:

Logical Processors: 8
Physical Processors: 1
Logical Processors (per CPU): 8
Total Cores: 4

ข้อควรระวัง

  • WMI ทำงานได้เฉพาะ Windows - Linux/macOS ใช้ไม่ได้
  • ต้องการสิทธิ์ Admin บางครั้งสำหรับ WMI query
  • ประสิทธิภาพ - WMI query ช้า ควร cache ผลลัพธ์หากเรียกบ่อย
  • Container/Docker - Environment.ProcessorCount อาจคืนค่า host ไม่ใช่ container limit (ใช้ cgroup แทน)

ทางเลือกสำหรับ Cross-Platform (.NET 6+)

// .NET 6+ มี API ใหม่ (ยัง experimental)
var info = System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture;
Console.WriteLine($"Architecture: {info}");

// สำหรับ Linux: อ่านจาก /proc/cpuinfo
// สำหรับ Docker: อ่านจาก /sys/fs/cgroup/cpu/cpu.cfs_quota_us