สำหรับ EP นี้เราก็มาถึงวิธีการดึงข้อมูลการใช้งาน CPU กัน เพื่อไม่ให้เป็นการเสียเวลา เรามาเริ่มกันเลย
สำหรับการดึงข้อมูลนั้น เราก็สามารถใช้งาน object PerformanceCounter ได้เหมือนเดิม โดยจะต้องระบุ parameter ที่จำเป็นดังนี้
PerformanceCounter cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total");
และเมื่อทดลองเรียกใช้งาน จะปรากฏผลดังภาพ
จะเห็นว่าผลลัพธ์ออกมาเป็น 0 เนื่องจากค่าที่ได้ จะเป็นค่าที่เกิดจากการเปรียบเทียบกับค่าก่อนหน้า การเรียกใช้งานครั้งแรกจึงแสดงผลเป็น 0 เสมอ เราจึงจำเป็นต้องหน่วงเวลาไว้ประมาณหนึ่ง จากนั้นจึงเรียกใช้งานอีกครั้งจึงจะได้ค่าที่ตรงตามความเป็นจริง ดังตัวอย่างต่อไปนี้
จากตัวอย่าง หลังเรียกใช้งานครั้งแรก จะหน่วงเวลาไว้ 1 วินาที จึงเรียกใช้งานอีกครั้ง
ซึ่งเทคนิคนี้ เอกสารของทาง Microsoft ก็ได้ระบุเอาไว้ ดังนี้
If the calculated value of a counter depends on two counter reads, the first read operation returns 0.0. Resetting the performance counter properties to specify a different counter is equivalent to creating a new performance counter, and the first read operation using the new properties returns 0.0. The recommended delay time between calls to the NextValue method is one second, to allow the counter to perform the next incremental read.
เพื่อให้เห็นภาพที่ชัดขึ้น ผมจะใช้การวนลูปเข้ามาช่วยเพื่อให้เห็นการทำงานของ CPU ที่เป็นจริงมากยิ่งขึ้น ดังโค้ดตัวอย่าง
โดยผลลัพธ์จากโค้ดด้านบน ก็จะแสดงการทำงานของ CPU ทุก 1 วินาทีเป็นจำนวน 10 ครั้ง
จะเห็นว่าการดึงข้อมูลการใช้งาน CPU ไม่ได้ยุ่งยาก แค่มีทริคนิดเดียวตรงที่จะต้องมีการเรียก NextValue() 2 ครั้ง และต้องมีการหน่วงเวลาก่อนการเรียกครั้งที่ 2 ก็จะได้ผลลัพธ์ที่ถูกต้อง
แล้วพบกันใน EP หน้า สวัสดีครับ
อ้างอิง
- https://stackoverflow.com/questions/278071/how-to-get-the-cpu-usage-in-c
- https://stackoverflow.com/questions/2181828/why-the-cpu-performance-counter-kept-reporting-0-cpu-usage
- https://gavindraper.com/2011/03/01/retrieving-accurate-cpu-usage-in-c/
- https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.performancecounter.nextvalue?view=dotnet-plat-ext-5.0