2012-02-13 48 views
7

Tôi muốn để có được sử dụng CPU cho một quá trình cụ thể ..Bắt sử dụng CPU của một quá trình trong C#

Mã này

total_cpu = new PerformanceCounter("Processor", "% Processor Time", "_Total"); 

hoạt động tuyệt vời. Số này tương ứng với số "Sử dụng CPU" trong Windows 'Task Manager.

Nhưng sau mang lại cho tôi số lạ ...

process_cpu = new PerformanceCounter("Process", "% Processor Time", "gta_sa"); 
var process_cpu_usage = (total_cpu_usage.NextValue()/100) * process_cpu.NextValue(); 

Như bạn có thể nhìn thấy trên ảnh chụp màn hình (thay vì "7", tôi nhận được "2,9 ..").

Processes

+0

Bạn đã cố gắng để đưa giấc ngủ trong vòng 1 giây giữa mỗi NetValue() gọi. Cuộc gọi đầu tiên tới NextValue() bắt đầu cuộc gọi đo và cuộc gọi tiếp theo sẽ đưa ra một số kết quả. Vì vậy, mẹo là tạo tất cả các đối tượng PerformanceCounter của bạn và ngay lập tức gọi NextValue() cho chúng. Sau đó, ngủ một giây, và gọi NextValue() cho tất cả chúng một lần nữa – Mohit

+0

thx, vâng, tôi gọi NetValue() mỗi giây .. –

Trả lời

11

Trên thực tế, quá trình \% Processor Time \ Instance truy cập trả về% của thời điểm đó quá trình giám sát sử dụng đúng thời hạn% người dùng cho một bộ xử lý duy nhất. Vì vậy, giới hạn là 100% * số lượng bộ xử lý bạn có.

Có vẻ như không phải là cách dễ dàng để tính toán giá trị mà taskmgr hiển thị bằng cách sử dụng bộ đếm nước hoa. Xem this link.

Cũng nên nhớ tỷ lệ sử dụng CPU không phải là một giá trị cố định, nhưng giá trị tính toán:

((total processor time at time T2) - (total processor time at time T1)/(T2 - T1)) 

Điều này có nghĩa rằng các giá trị phụ thuộc vào cả hai T2 và T1, do đó có thể có sự khác biệt giữa những gì bạn thấy trên trình quản lý tác vụ và những gì bạn tính toán, nếu T2 và T1 được Trình quản lý tác vụ sử dụng hơi khác so với T2 và T1 được chương trình của bạn sử dụng.


Nếu bạn quan tâm, tôi có thể cung cấp cho bạn một số mã để lấy giá trị này bằng P/Gọi. Nhưng sẽ làm mất đi những lợi ích của Bộ đếm hiệu suất (như giám sát các quy trình từ xa).

+0

Nếu mức sử dụng CPU của tôi là 17% và process_cpu_usage là 100%, điều đó có nghĩa là quá trình của tôi sử dụng tất cả 17 % ?? Và vấn đề thứ hai, đôi khi tôi nhận được hơn 100% từ process_cpu_usage, ví dụ 102% ... –

+0

@ MarekJavůrek 'process_cpu.NextValue()' trả về là gì? Có bao nhiêu CPU và lõi có trên máy của bạn? – ken2k

+0

nếu tải CPU của tôi là khoảng 15% và quá trình của tôi sử dụng tất cả 15% sau đó process_cpu.NextValue() trả về số như 99 hoặc 100 .. tahts lý do tại sao tôi làm điều này: var process_cpu_usage = (total_cpu_usage.NextValue()/100) * process_cpu .NextValue(); ... CPU của tôi là i5-2430M –

6

Chia cho bộ xử lý/số lõi là kết quả khá chính xác khi so sánh với Trình quản lý tác vụ.

Để cứu người thời gian:

// This will return the process usage as a percent of total processor utilisation. 
var processUsage = process_cpu_usage/nextValue()/Environment.ProcessorCount; 
Các vấn đề liên quan