You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PowerShell中Where-Object首次执行慢后续极快的性能问题问询

为什么PowerShell中首次Where-Object筛选AD组比重复执行慢这么多?

核心原因:AD属性的延迟加载与本地缓存

  • 首次执行的延迟来源:Get-ADGroup默认采用**延迟加载(Lazy Loading)**机制——它只会取回AD对象的基础属性(比如组名、SID),而像gidNumber这类扩展属性,只有当你首次访问它时,PowerShell才会单独向AD服务器发送请求去获取该属性的值。你首次执行Where-Object时,要遍历1049个对象并逐个读取gidNumber,这就触发了1049次额外的AD查询,总耗时自然被拉长到1分40多秒。
  • 重复执行的提速逻辑:第一次访问gidNumber后,PowerShell会把这些属性值缓存到本地的对象实例中。重复执行筛选时,直接读取本地缓存的数据,完全不需要再和AD服务器通信,所以耗时骤降到十几毫秒。

验证与优化方法

  • 提前加载属性消除延迟:如果在获取AD组时就明确指定要加载gidNumber属性,首次筛选的速度会和重复执行基本一致:
    # 提前加载gidNumber属性
    $posixGroups = Get-ADGroup -Filter {ObjectClass -eq 'posixGroup'} -Properties gidNumber
    # 首次执行筛选也会很快
    $posixGroups | Where-Object {$_.gidNumber -eq 500}
    
  • 确认缓存生效:你可以通过Get-Member查看对象的属性状态,首次访问gidNumber前,它属于ScriptProperty(延迟加载的属性),访问后会变成NoteProperty(缓存到本地的属性)。

内容的提问来源于stack exchange,提问作者Brian McMahon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 02:25:00