【问题标题】:Why is Get-WMIObject Win32_Process in Powershell so slow and what are the alternatives?为什么 Powershell 中的 Get-WMIObject Win32_Process 这么慢,有什么替代方案?
【发布时间】:2017-07-20 22:55:00
【问题描述】:

我正在创建一个工具来跟踪内存和 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 #>

问题:为什么这么慢,我该怎么办(主要动机是使用私有工作集和 Get-WMIObject 在我的工具中提供的许多其他指标)。从 C/C++/C# 实用程序与 Win32_PerfRawData_PerfProc_Process 交互是否是在 Powershell 中使用它的好选择?

【问题讨论】:

    标签: windows performance powershell performance-testing


    【解决方案1】:

    听起来并不悲观或任何事情,但在 powershell 中,速度很慢,速度也很慢。使用 measure-command 查找“stuff”运行所需的时间。 用法: 测量命令 { Get-WMIObject Win32_Process -Filter "ProcessId='24380'"}

    与 wmi 存储交互的“现代”方式是使用 CIM 实例。使用您正在使用的时间方法或测量命令查看这对您来说是否更快。 例子:/ Measure-Command {Get-Ciminstance -classname Win32Process -filter "processID='24380'"}

    【讨论】:

    • PS 慢有什么特别的原因(内存、计算、上下文切换)?我看到get-process 快得多 - 也许它是命令行开关的实现而不是 PS 本身?
    • 刚刚通过CIM对Win32进程对象的交互进行了基准测试,得到了类似的结果:time { Get-CimInstance -ClassName Win32_Process -Filter "ProcessId='24380'" } -Samples 10 -Silent:.......... Avg: 198.236ms Min: 188.6055ms Max: 230.1188ms
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多