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
相关产品推荐
相关产品推荐

