|
<# |
|
.SYNOPSIS |
|
Quick Hits: Speed Up Some of your Commands by Avoiding the Pipeline |
|
.DESCRIPTION |
|
Sometimes running a command using the pipeline can take a while depending on the amount of data that is being processed. |
|
For the easiest example, I will make use of Get-Random to demonstrate the differences in speed and how much memory is used. |
|
.LINK |
|
Thanks: https://learn-powershell.net/2013/01/13/quick-hits-speed-up-some-of-your-commands-by-avoiding-the-pipeline/ |
|
#> |
|
|
|
# Breifly introduce the current running script. |
|
Write-Host "`n" ($MyInvocation.ScriptName) |
|
# Get-Help wont work if script starts with function... |
|
Write-Host (Get-Help $PSCommandPath).Synopsis -ForegroundColor DarkGray |
|
|
|
function Test-RandomPipelineBenchmark { |
|
|
|
<# |
|
.DESCRIPTION |
|
Here you see that it takes a little over a minute to run, |
|
but the amount of memory used isn’t a whole lot; about 6KB. |
|
Instead, you should take a look at using the '–InputObject' parameter |
|
as it accepts a collection of objects to use instead for much faster performance. |
|
.OUTPUTS |
|
Memory Before: 206, 064KB |
|
TotalSeconds : 6.2035622 |
|
Memory After : 206, 064KB |
|
#> |
|
|
|
("Memory Before: {0:#,#}KB" -f ((Get-Process -Id $PID).PeakWorkingSet / 1kb)) |
|
("TotalSeconds : {0}" -f (Measure-Command { 1..1E6 | Get-Random }).TotalSeconds) |
|
("Memory After : {0:#,#}KB" -f ((Get-Process -Id $PID).PeakWorkingSet / 1kb)) |
|
} |
|
|
|
function Test-RandomInputObjectBenchmark { |
|
|
|
<# |
|
.DESCRIPTION |
|
This didn’t event take a second to run using the InputObject parameter. |
|
However, you will see that the amount of memory required to perform this operation jumped up by about 20KB, |
|
so caution should be used if trying to run this against a lot of data to avoid running into memory issues. |
|
.OUTPUTS |
|
Memory Before: 206, 204KB |
|
TotalSeconds : 0.36981 |
|
Memory After : 238, 912KB |
|
#> |
|
|
|
("Memory Before: {0:#,#}KB" -f ((Get-Process -Id $PID).PeakWorkingSet / 1kb)) |
|
("TotalSeconds : {0}" -f (Measure-Command { Get-Random -InputObject (1..1E6) }).TotalSeconds) |
|
("Memory After : {0:#,#}KB" -f ((Get-Process -Id $PID).PeakWorkingSet / 1kb)) |
|
} |
|
|
|
# Run the Test-Functions |
|
Write-Host "$('-'*80)" -ForegroundColor DarkGray # Seperator |
|
Write-Host "Running: Benchmark #1 [Pipeline]" |
|
Test-RandomPipelineBenchmark |
|
Write-Host "$('-'*80)" -ForegroundColor DarkGray # Seperator |
|
Write-Host "Running: Benchmark #1 [InputObject]" |
|
Test-RandomInputObjectBenchmark |
|
Write-Host "$('-'*80)" -ForegroundColor DarkGray # Seperator |