c# вычисление загрузки процессора для конкретного приложения
Я пытаюсь выяснить, как получить использование процессора для конкретного процесса, но могу найти только информацию, относящуюся к общему использованию процессора.
Кто-нибудь знает, как извлечь текущую загрузку процессора в процентах для конкретного приложения?
4 ответов:
Счетчики Производительности-Процесс - % Процессорного Времени.
Небольшой пример кода, чтобы дать вам идею:
using System; using System.Diagnostics; using System.Threading; namespace StackOverflow { class Program { static void Main(string[] args) { PerformanceCounter myAppCpu = new PerformanceCounter( "Process", "% Processor Time", "OUTLOOK", true); Console.WriteLine("Press the any key to stop...\n"); while (!Console.KeyAvailable) { double pct = myAppCpu.NextValue(); Console.WriteLine("OUTLOOK'S CPU % = " + pct); Thread.Sleep(250); } } } }Примечания для поиска экземпляра на основе идентификатора процесса :
Я не знаю лучшего способа, и надеюсь, что кто-нибудь знает. Если нет, то вот один из способов, которым вы можете найти правильное имя экземпляра для вашего процесса, учитывая идентификатор процесса и имя процесса.Существует еще один счетчик производительности (PC), называемый
"ID Process"в семействе"Process". Он возвращает PID для пример. Таким образом, если вы уже знаете имя (например, "chrome" или "myapp"), вы можете проверить каждый экземпляр, пока не найдете соответствие для PID.Именование прост для каждого экземпляра: "приложение" "приложение myapp#1" "приложение myapp#2" ... и т.д.
... new PerformanceCounter("Process", "ID Process", appName, true);Как только значение ПК будет равно PID, вы найдете правильный
appName. Затем вы можете использовать этотappNameдля других счетчиков.
Метод расчета использования процессора для одного процесса без использования PerformanceCounter.
using System; using System.Diagnostics; namespace cpuusage { class Program { private static DateTime lastTime; private static TimeSpan lastTotalProcessorTime; private static DateTime curTime; private static TimeSpan curTotalProcessorTime; static void Main(string[] args) { string processName = "OUTLOOK"; Console.WriteLine("Press the any key to stop...\n"); while (!Console.KeyAvailable) { Process[] pp = Process.GetProcessesByName(processName); if (pp.Length == 0) { Console.WriteLine(processName + " does not exist"); } else { Process p = pp[0]; if (lastTime == null || lastTime == new DateTime()) { lastTime = DateTime.Now; lastTotalProcessorTime = p.TotalProcessorTime; } else { curTime = DateTime.Now; curTotalProcessorTime = p.TotalProcessorTime; double CPUUsage = (curTotalProcessorTime.TotalMilliseconds - lastTotalProcessorTime.TotalMilliseconds) / curTime.Subtract(lastTime).TotalMilliseconds / Convert.ToDouble(Environment.ProcessorCount); Console.WriteLine("{0} CPU: {1:0.0}%",processName,CPUUsage * 100); lastTime = curTime; lastTotalProcessorTime = curTotalProcessorTime; } } Thread.Sleep(250); } } } }Вы можете перебирать процессы, чтобы выбрать, какой из них, или если вы уже знаете идентификатор, просто используйте эту команду вместо GetProcessesByName ()
Process p = Process.GetProcessById(123);
Я собрал информацию из нескольких ответов (наиболее заметно Этот ) и придумал следующий код, который может получить информацию об использовании процессора и оперативной памяти текущего процесса на основе информации счетчика производительности, предоставленной Windows:
public object GetUsage() { // Getting information about current process var process = Process.GetCurrentProcess(); // Preparing variable for application instance name var name = string.Empty; foreach (var instance in new PerformanceCounterCategory("Process").GetInstanceNames()) { if (instance.StartsWith(process.ProcessName)) { using (var processId = new PerformanceCounter("Process", "ID Process", instance, true)) { if (process.Id == (int)processId.RawValue) { name = instance; break; } } } } var cpu = new PerformanceCounter("Process", "% Processor Time", name, true); var ram = new PerformanceCounter("Process", "Private Bytes", name, true); // Getting first initial values cpu.NextValue(); ram.NextValue(); // Creating delay to get correct values of CPU usage during next query Thread.Sleep(500); dynamic result = new ExpandoObject(); // If system has multiple cores, that should be taken into account result.CPU = Math.Round(cpu.NextValue() / Environment.ProcessorCount, 2); // Returns number of MB consumed by application result.RAM = Math.Round(ram.NextValue() / 1024 / 1024, 2); return result; }Имя экземпляра определяется без каких-либо хаков или догадок, я также забочусь о нескольких ядрах.
Полученная информация встроена в информацию, которую я вижу в окне process explorer и performance в VS.
PerformanceCounter ProcessCPUCounter = new PerformanceCounter(); ProcessCPUCounter.CategoryName = "Process"; ProcessCPUCounter.CounterName = "% Processor Time"; ProcessCPUCounter.InstanceName = "TestServiceName"; ProcessCPUCounter.ReadOnly = true; t3 = new Timer(); t3.Tick += new EventHandler(ProcessCPUThread); // Everytime t3 ticks, th2_Tick will be called t3.Interval = (1000) * (1); // Timer will tick evert second t3.Enabled = true; // Enable the t3 t3.Start(); private void ProcessCPUThread(object sender, EventArgs e) { try { Int32 processCPU = Convert.ToInt32( ProcessCPUCounter.NextValue()); tbCPUperPrcocess.Text = Convert.ToString(processCPU / Environment.ProcessorCount); } catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); } }
Comments