Мне нужно сделать что-то наподобие диспетчера задач. Поначалу всё было замечально, пока не начал собирать информацию о нагрузке цп и видеокарты. В итоге решил, что буду использовать powershell, чтобы узнать нагрузку на видеокарту:
function GetProcessInfo {
$lang = ([CultureInfo]::InstalleduICulture).Name
if ($lang -match "ru-") { $cpucounter = '\процесс(*)\% загруженности процессора' }
else { $cpucounter = '\process(*)\% processor time' }
$allProcesses = (Get-Counter $cpucounter -ErrorAction SilentlyContinue).CounterSamples | Sort CookedValue -Descending
$results = @()
foreach ($process in $allProcesses) {
$processName = $process.InstanceName
$pidi = (Get-Process -Name $processName).Id
$username = (Get-Process -Name $processName -IncludeUserName).UserName
$p = Get-Process -id $pidi
$temp = 0
$gpu = ((Get-Counter "\GPU Engine(pid_$($p.id)*engtype_3D)\Utilization Percentage").CounterSamples | where CookedValue).CookedValue
foreach ($p in $gpu) {
$temp = [math]::Round($p, 2)
}
[pscustomobject]@{
ProcessName = $processName
PID = $pidi
CPU = [math]::Round(($process.CookedValue / ($allProcesses.CookedValue)[0] * 100), 2)
User = $username
GPU = [math]::Round($temp, 2)
}
}
$results
}
GetProcessInfo
Но этот код выполняется очень долго. Чтобы обновить список процессов со всей информацией о них, нужно секунд 20.
А ещё же нужно обновлять этот список раз в секунду, желательно.
Подскажите, пожалуйста, как оптимизировать программу?