วิธีการทำงานกับตัวนับประสิทธิภาพใน C #

Windows คอยเฝ้าดูกระบวนการและบริการที่กำลังทำงานอยู่ในระบบของคุณโดยการติดตามเธรดที่กำลังดำเนินการอยู่หน่วยความจำ CLR ฯลฯ คุณมักจะต้องวัดประสิทธิภาพของระบบคอมพิวเตอร์หรือแอปพลิเคชันที่ทำงานอยู่ เพื่อเมตริกเช่นการใช้ทรัพยากรในระบบบริการที่ทำงานบนระบบหรือประสิทธิภาพของอุปกรณ์ที่เชื่อมต่อกับระบบ

ตัวนับประสิทธิภาพ (คุณลักษณะที่มีให้โดยค่าเริ่มต้น) ช่วยให้เราสามารถบันทึกเผยแพร่และวิเคราะห์ข้อมูลประสิทธิภาพที่เกี่ยวข้องกับแอปพลิเคชันหรือบริการอย่างน้อยหนึ่งรายการที่ทำงานในระบบหรือทั้งระบบ

ในขณะสร้างแอปพลิเคชันคุณมักจะต้องตรวจสอบประสิทธิภาพ (การใช้ทรัพยากรหรือการใช้งานในช่วงเวลาหนึ่ง) และใช้ข้อมูลประสิทธิภาพเพื่อระบุปัญหาคอขวดในแอปพลิเคชัน นี่คือสิ่งที่ตัวนับประสิทธิภาพมีประโยชน์ คุณยังสามารถใช้ WMI (Windows Management Instrumentation) ซึ่งเป็นเทคโนโลยีของ Microsoft ที่ใช้ COM เพื่อเรียกดูรายละเอียดเหล่านี้ แต่ตัวนับประสิทธิภาพจะช่วยให้คุณได้รับสถิติแบบเรียลไทม์ของการใช้ทรัพยากรในระบบของคุณในขณะรันไทม์

สามารถใช้สแน็ปอิน Performance Monitor (เครื่องมือที่มีให้ตามค่าเริ่มต้นใน Windows OS) เพื่อดูข้อมูลประสิทธิภาพแบบเรียลไทม์ ในการเริ่มต้นเครื่องมือนี้ให้คลิกที่เมนูเริ่มแล้วคลิกที่ "เรียกใช้" จากนั้นพิมพ์ "perfmon" แล้วกด Enter

ตัวนับประสิทธิภาพที่กำหนดเอง

การสร้างตัวนับประสิทธิภาพแบบกำหนดเองนั้นง่ายมาก คุณสามารถสร้างตัวนับประสิทธิภาพโดยใช้ Server Explorer คุณจะต้องสร้างหมวดหมู่ตัวนับประสิทธิภาพก่อนจากนั้นจึงสร้างตัวนับหนึ่งตัวขึ้นไปเป็นส่วนหนึ่งของหมวดหมู่นั้น

ในการทำงานกับตัวนับประสิทธิภาพโดยใช้โปรแกรมคุณสามารถใช้คลาส System.Diagnostics.PerformanceCounter คุณจะต้องสร้างอินสแตนซ์ของคลาส PerformanceCounter จากนั้นระบุค่าที่จำเป็นสำหรับคุณสมบัติเหล่านี้: CategoryName, CounterName, MachineName และ ReadOnly

ในการสร้างหมวดหมู่ตัวนับประสิทธิภาพแบบกำหนดเองคุณจะต้องใช้ประโยชน์จากเมธอด Create ของคลาส PerformanceCounterCategory ตัวอย่างเช่นคุณสามารถใช้ข้อมูลโค้ดต่อไปนี้เพื่อสร้างหมวดหมู่ตัวนับประสิทธิภาพที่กำหนดเอง

PerformanceCounterCategory.Create("CustomPerformanceCounterCategoryName", "CustomPerformanceCounterHelp", PerformanceCounterCategoryType.MultiInstance,

"CustomPerformanceCounterName", "CustomPerformanceCounterHelp");

ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่คุณสามารถแสดงหมวดหมู่ตัวนับประสิทธิภาพทั้งหมดที่มี

static void Main()

    {

        var performanceCounterCategories = PerformanceCounterCategory.GetCategories();

        foreach(PerformanceCounterCategory performanceCounterCategory in performanceCounterCategories)

        {

         Console.WriteLine(performanceCounterCategory.CategoryName);

        }

        Console.Read();

    }

ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นถึงวิธีการดึงตัวนับประสิทธิภาพที่อยู่ในหมวดหมู่ "โปรเซสเซอร์"

var performanceCounterCategories = PerformanceCounterCategory.GetCategories()

     .FirstOrDefault(category => category.CategoryName == "Processor");

var performanceCounters = performanceCounterCategories.GetCounters("_Total");

คุณต้องใช้คลาส PerformanceCounter เพื่ออ่านตัวนับประสิทธิภาพที่อยู่ในหมวดหมู่เฉพาะ โปรดสังเกตว่าคลาส PerformanceCounter พร้อมใช้งานในเนมสเปซ System.Diagnostics นี่คือรายการรหัสทั้งหมดที่แสดงวิธีที่คุณสามารถแสดงชื่อตัวนับประสิทธิภาพของตัวนับประสิทธิภาพทั้งหมดที่อยู่ในหมวดหมู่ "ตัวประมวลผล"

static void Main()

    {

        var performanceCounterCategories = PerformanceCounterCategory.GetCategories()

            .FirstOrDefault(category => category.CategoryName == "Processor");

        var performanceCounters = performanceCounterCategories.GetCounters("_Total");

        Console.WriteLine("Displaying performance counters for Processor category:--\n");

        foreach (PerformanceCounter performanceCounter in performanceCounters)

        {

            Console.WriteLine(performanceCounter.CounterName);

        }

        Console.Read();

    }

คุณยังสามารถสร้างตัวนับประสิทธิภาพที่กำหนดเองและเขียนข้อมูลลงไปได้ ในการดำเนินการนี้คุณควรใช้ประโยชน์จากคลาส CounterCreationDataCollection และ CounterCreationData

String customCategory = "Custom Performance Counter Category";

if (!PerformanceCounterCategory.Exists(customCategory))

{

CounterCreationDataCollection counterCreationDataCollection = new CounterCreationDataCollection();

counterCreationDataCollection.Add(new CounterCreationData("Counter 1", "Sample Counter 1", PerformanceCounterType.ElapsedTime));

counterCreationDataCollection.Add(new CounterCreationData("Counter 2", "Sample Counter 2", PerformanceCounterType.SampleCounter));

counterCreationDataCollection.Add(new CounterCreationData("Counter 3", "Sample Counter 3", PerformanceCounterType.SampleCounter));

PerformanceCounterCategory.Create(customCategory, "This is just an example", PerformanceCounterCategoryType.SingleInstance, counterCreationDataCollection);

}

โปรดทราบว่าการตรวจสอบว่าทำขึ้นเพื่อตรวจสอบว่าตัวนับประสิทธิภาพแบบกำหนดเองที่จะสร้างมีอยู่แล้วหรือไม่ ตัวนับประสิทธิภาพแบบกำหนดเองจะถูกสร้างขึ้นหากไม่มีอยู่เท่านั้น ถัดไปอินสแตนซ์ของ CounterCreaionDataCollection จะถูกสร้างขึ้น การใช้คลาส CounterCreationData ตัวนับใหม่จะถูกเพิ่มลงในคอลเล็กชัน เมื่อเพิ่มตัวนับที่จำเป็นแล้วเมธอด Create ของคลาส PerformanceCounterCategory จะถูกเรียกเพื่อสร้างประเภทประสิทธิภาพที่กำหนดเอง

โปรดทราบว่าแอปพลิเคชันของคุณควรมีสิทธิ์ที่จำเป็นในการเข้าถึงตัวนับประสิทธิภาพที่คุณต้องการ ฉันอยากจะแนะนำให้เริ่ม Visual Studio IDE ในโหมดผู้ดูแลระบบเสมอ ตัวนับประสิทธิภาพช่วยในการวิเคราะห์ประสิทธิภาพของแอปพลิเคชันของคุณได้มาก - คุณสามารถวิเคราะห์ข้อมูลประสิทธิภาพในเวลาที่แอปพลิเคชันของคุณกำลังดำเนินการอยู่