windows - Hvorfor er Get-WMIObject Win32\_Process i PowerShell så langsomt og hvad er alternativerne?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skaber et værktøj, der ville spore hukommelsen og CPU-brugen eller en bestemt proces af valg. For at gøre værktøjet præcist ønskede jeg at spore ressourcerne nøje, probing for dem hver 50m siger det.


En antagelse blev gjort, at alting der sker inden for en moderne computer (med undtagelse af netværk IO, brugerindgang) vil ikke tage mere tid end det (hvis det ikke er en stor beregning, skal det være meget hurtigt). Jeg havde det galt, og Get- WMIObject CMD 'Lad tager meget mere for at returnere resultater, sammenlign venligst:


time { Get-WMIObject Win32\_Process -Filter "ProcessId='24380'"} -Samples 10 -Silent
# ..........
# Avg: 190.5335ms
# Min: 180.3689ms
# Max: 203.6968ms #>


-


time { get-process -name *chrome* 2> $null } -Samples 10 -Silent
# ..........
# Avg: 5.2ms
# Min: 3.7711ms
# Max: 13.5161ms #>


Spørgsmål: Hvorfor er det så langsomt, og hvad kan jeg gøre ved det (den vigtigste motivation er at bruge privat arbejdssæt og mange andre målinger, som Get-WMIObject leverer i mit værktøj). Vil interagere med Win32\_PerfRawData\_PerfProc\_Process fra et C/C ++/C # -værktøj være et godt alternativ til at bruge det i Powershell?

Bedste reference


Ikke at lyde pessimistisk eller noget, men i powerhell er der langsomt og der er langsommere. Brug measure-command for at finde den tid det tager for 'stuff' at køre.
Anvendelse:
    Mål-kommando {Get-WMIObject Win32\_Process -Filter 'ProcessId =' 24380 ''}


Den 'moderne' måde at interagere med wmi-butikken på er at bruge CIM-tilfælde. Se om det er hurtigere for dig at bruge den tidsmetode du bruger eller måle-kommando.
Eksempel:/
     Mål-kommando {Get-Ciminstance -classname Win32Process-filter 'processID =' 24380 ''}