我正在创建一个工具来跟踪内存和 CPU 使用情况或选择的特定进程。为了使工具更加精确,我需要密切跟踪资源,每隔 50 毫秒探测一次。
假设现代计算机内部发生的任何事情(不包括网络 IO、用户输入)都不会花费比这更多的时间(如果计算量不大,它应该非常快)。我错了,Get-WMIObject CMD'let 需要更多的时间才能返回结果,请比较:
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 #>
问题:为什么它这么慢,我能做些什么(主要动机是使用私有(private)工作集和 Get-WMIObject 在我的工具中提供的许多其他指标)。从 C/C++/C# 实用程序与 Win32_PerfRawData_PerfProc_Process
进行交互是否是在 Powershell 中使用它的一个很好的替代方案?
最佳答案
并不是要听起来悲观什么,但在 powershell 中,速度很慢,而且速度更慢。使用测量命令来查找“东西”运行所需的时间。 用法: 测量命令 { Get-WMIObject Win32_Process -Filter "ProcessId='24380'"}
与 wmi 存储交互的“现代”方式是使用 CIM 实例。看看使用您正在使用的时间方法或测量命令是否更快。 例子:/ Measure-Command {Get-Ciminstance -classname Win32Process -filter "processID='24380'"}
关于windows - 为什么 Powershell 中的 Get-WMIObject Win32_Process 如此慢,有哪些替代方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45226455/