Summary of the new feature/enhancement
As it stands I've stopped using Where-Object in performance-related scenarios. I used it a lot when creating different scripts but then I found out it's actually 7-10x slower than simple foreach loop.
$UsersAll = Get-ADUser -Properties Manager, DisplayName, EmailAddress -Filter '*'
$UsersWithManagers = foreach ($User in $UsersAll) {
$Manager = ($UsersAll | Where-Object { $User.Manager -eq $_.DistinguishedName })
[PSCustomobject] @{
SamAccountName = $User.SamAccountName
Manager = $User.Manager
ManagerDisplay = $Manager.DisplayName
ManagerEmail = $Manager.EmailAddress
}
}
$UsersWithManagers | Format-Table -AutoSize
This takes 7 minutes 54 seconds on a domain of size 4412 users. With foreach approach like this:
$UsersAll = Get-ADUser -Properties Manager, DisplayName, EmailAddress -Filter '*'
$UsersWithManagers = foreach ($User in $UsersAll) {
$Manager = foreach ($_ in $UsersAll) {
if ($User.Manager -eq $_.DistinguishedName) {
$_
break
}
}
[PSCustomobject] @{
SamAccountName = $User.SamAccountName
Manager = $User.Manager
ManagerDisplay = $Manager.DisplayName
ManagerEmail = $Manager.EmailAddress
}
}
$UsersWithManagers | Format-Table -AutoSize
It takes just 59 seconds. I ended up using hashtable for that particular problem (https://evotec.xyz/how-i-didnt-know-how-powerful-and-fast-hashtables-are/) but the main idea here is that Where-Object is just slow for larger loops.
It would be really cool to "fix" this in PowerShell 7 so Where-Object can once again be used as GO TO to solution for filtering stuff.
Summary of the new feature/enhancement
As it stands I've stopped using Where-Object in performance-related scenarios. I used it a lot when creating different scripts but then I found out it's actually 7-10x slower than simple foreach loop.
This takes 7 minutes 54 seconds on a domain of size 4412 users. With foreach approach like this:
It takes just 59 seconds. I ended up using hashtable for that particular problem (https://evotec.xyz/how-i-didnt-know-how-powerful-and-fast-hashtables-are/) but the main idea here is that Where-Object is just slow for larger loops.
It would be really cool to "fix" this in PowerShell 7 so Where-Object can once again be used as GO TO to solution for filtering stuff.