Harder, Better, Faster, Stronger…”-filter” vs. “where-object”

eeac7149d557a4ef83b3f499c24563e8--simpsons-meme-the-simpsons

Some time ago I was measuring execution times of posh lines with -filter and where-object.

The difference is significant:

PS D:\AdminTools> measure-command {Get-remotemailbox -Filter {RecipientTypeDetails -eq "RemoteRoomMailbox" -and name -like "*people*"}}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 756
Ticks             : 7564893
TotalDays         : 8,75566319444444E-06
TotalHours        : 0,000210135916666667
TotalMinutes      : 0,012608155
TotalSeconds      : 0,7564893
TotalMilliseconds : 756,4893

PS D:\AdminTools> measure-command {Get-remotemailbox | ? {$_.RecipientTypeDetails -eq "RemoteRoomMailbox" -and $_.name -like "*people*"}}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 18
Milliseconds      : 415
Ticks             : 184153984
TotalDays         : 0,000213141185185185
TotalHours        : 0,00511538844444444
TotalMinutes      : 0,306923306666667
TotalSeconds      : 18,4153984
TotalMilliseconds : 18415,3984

We can see here that commands with -filter can be significantly quicker – almost 3 times quicker.

Where does it come from you may ask? Well, the “-filter” tells the source to filter the results BEFORE sending back to the requester, whilst when using “where-object” tells the source to send ALL results to the requster and later the requester picks the right records.

Advertisements

PowerShell -Filter vs. Where-Object – what is the main difference?

Well – timing. For instance if we would like to ask AD for certain user accounts,  -Filter will process the data on the remote computer (domain controller) and will send us only the filtered results, whilst Where-Object (?) will sends us all the results, and “filtering” takes places on our end. Here is a small example of the speed differences:

measure-command {Get-remotemailbox -Filter {RecipientTypeDetails -eq "RemoteRoomMailbox" -and name -like "*people*"}}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 756
Ticks             : 7564893
TotalDays         : 8,75566319444444E-06
TotalHours        : 0,000210135916666667
TotalMinutes      : 0,012608155
TotalSeconds      : 0,7564893
TotalMilliseconds : 756,4893

measure-command {Get-remotemailbox | ? {$_.RecipientTypeDetails -eq "RemoteRoomMailbox" -and $_.name -like "*people*"}}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 18
Milliseconds      : 415
Ticks             : 184153984
TotalDays         : 0,000213141185185185
TotalHours        : 0,00511538844444444
TotalMinutes      : 0,306923306666667
TotalSeconds      : 18,4153984
TotalMilliseconds : 18415,3984

Filter was 24 times faster!