Tuning PowerShell scripts for performance
In PowerShell, as with most things with computers, there is often more than one way to accomplish a task. Therefore the question is not always how to accomplish a task, it is how best to accomplish the task. Often times the answer comes down to how fast a certain method performs.
In this recipe, we will look at different methods to retrieve the local groups on a member server. The different methods will be benchmarked to determine the optimal method.
Getting ready
In this example, we will be listing the NT groups on the local computer. To do this we will be querying the Win32_Group WMI class. This class however, returns all local computer groups, as well all domain groups. If you have a domain environment with a large number of groups, this process can be extensive.
How to do it...
Carry out the following steps:
Start by identifying different methods to list local groups on a computer:
Get-WmiObject -Class Win32_Group | Where-Object Domain -eq $env:COMPUTERNAME Get-WmiObject -Query "select * from Win32_Group where Domain='$env:ComputerName'"
Benchmark the first task using
Measure-Command
:Benchmark the second task using
Measure-Command
:
How it works...
Both of these commands perform the same task, querying WMI for local groups on our server.
The first command retrieves all groups from WMI (local and domain), then filters based on the domain name attribute
The second command uses a query against WMI with a filter applied based on the domain name, WMI then returns the group objects to PowerShell
In this situation, the first command took several minutes to complete, while the second command took only 79 milliseconds. Both commands result in returning the same data, so this suggests the second method is more ideal for my current situation.
There's more...
Neither of these tasks is right nor wrong, they simply differ where the filtering process took place. However, the first method may be preferred based on what else is being done. For instance, if I was doing a large amount of work with groups and group membership, both in the domain and local system, the first method may be preferred.
If the results of the first WMI command were saved to a variable prior to filtering, then different filtering could be applied after. This one object could be filtered multiple times to provide different information, instead of requiring multiple queries against WMI.