I’ve given a presentation at PowerShell User Groups several
times that involve quantifying how much money you save your organizations
through PowerShell. Of course my actual
goal is to help IT Pros justify a bigger raise. I’m working on some new coding practices to
help speed up your code execution. I’m
actually developing this code for both my Advance PowerShell Toolmaking class
and also as a topic to hopefully present at the PowerShell Europe Summit in
2017 (Keeping my fingers crossed). Here
is just one of 19 (and counting) ways that I have come up with to accelerate
code execution.
I’m looking at replacing PowerShell cmdlets with .NET
objects. This example below looks at
replacing Get-Content with [System.IO.StreamReader]. I utilized a text file of one of my favorite
books, 20,000 Leagues Under the Sea by Jules Verne. The results are in measurement of time called ticks. This is because milliseconds were
too big.
[System.IO.StreamReader] vs. Get-Content
----------------------------------------
Information on 20,000 Leagues Under the Sea
Number of lines: 12518
ReadToEnd : ReadToEndAsync : Get-Content
25671 : 8039 : 3685429
47580 : 5030 : 3601630
18351 : 4040 : 3602349
47085 : 5056 : 3578195
19283 : 4447 : 3778645
47591 : 5425 : 3620563
19420 : 4615 : 3567812
44806 : 4961 : 3550549
20025 : 4219 : 3727009
45259 : 5125 : 3718870
As you can see, using the ReadToEndAsync method of
System.IO.StreamReader is around 99% faster than Get-Content. The test was
completed 10 times with clear results each time. Below is the code. I apologize for the excessive use of
Write-Host, but this code is developed for use in the classroom, not
production.
#region [System.IO.StreamReader] vs. Get-Content
# look at using [IO.Filestream] and [System.IO.StreamReader]
as opposed to Get-Content or event Import cmdlets
Clear-Host
Write-Host
Write-Host '[System.IO.StreamReader] vs. Get-Content' -ForegroundColor Yellow
Write-Host '----------------------------------------' -ForegroundColor Yellow
Write-Host
Write-host "Information on 20,000 Leagues Under the Sea"
# Location of
20,000 Leagues Under the Sea.
$File
= 'E:\One
Drive\OneDrive\MCTExpert\Classes\PS405\CodeOptimization\20KUnderTheSea.txt'
$Lines
= (Get-Content -Path
$File | Measure-Object
-Line).Lines
Write-Host "Number of lines: " -NoNewline
Write-Host $Lines -ForegroundColor
Cyan
Write-Host
Write-Host 'ReadToEnd : ReadToEndAsync : Get-Content'
# Perform the
test 10 times.
For ($X = 0 ; $X -lt 10 ; $X++)
{
# Test 1
- Use the ReadToEnd() method of [System.Io.Streamreader]
$Test1
= (Measure-Command -Expression
{
$Book
= New-Object -TypeName
System.IO.StreamReader -ArgumentList $File;
$Book.ReadToEnd()
| Out-Null
}).Ticks
# Test 2
- Use the ReadToEndAsync() method of [System.Io.Streamreader]
$Test2
= (Measure-Command -Expression
{
$Book
= New-Object -TypeName
System.IO.StreamReader -ArgumentList $File;
$Book.ReadToEndAsync()
| Out-Null
}).Ticks
# Test 3
- Use the PowerShell Cmdlet Get-Content.
$Test3
=( Measure-Command -Expression
{
Get-Content -Path $File | Out-Null
}).ticks
# Provide
for color coded output to display in class.
# Green -
Fastest.
# Light
blue - 2nd.
# Dark
blue - slowest.
$Color1
= "DarkCyan"
$Color2
= "DarkCyan"
$Color3
= "DarkCyan"
If ($Test1 -lt $Test2
-and $Test1 -lt $Test3)
{$Color1 = "DarkGreen"}
ElseIf
($Test2 -lt $Test1
-and $Test2 -lt $Test3)
{$Color2 = "DarkGreen"}
ElseIf
($Test3 -lt $Test1
-and $Test3 -lt $Test2)
{$Color3 = "DarkGreen"}
If ($Test1 -gt $Test2
-and $Test1 -gt $Test3)
{$Color1 = "DarkBlue"}
ElseIf
($Test2 -gt $Test1
-and $Test2 -gt $Test3)
{$Color2 = "DarkBlue"}
ElseIf
($Test3 -gt $Test1
-and $Test3 -gt $Test2)
{$Color3 = "DarkBlue"}
Write-Host
"$Test1" -BackgroundColor
$Color1 -NoNewline
Write-Host
' : ' -ForegroundColor
White -NoNewline
Write-Host
"$Test2" -BackgroundColor
$Color2 -NoNewline
Write-Host
' : '
-ForegroundColor White
-NoNewline
Write-Host
"$Test3" -BackgroundColor
$Color3
} # END: For
($X = 0 ; $X -lt 10 ; $X++)
#endregion
[System.IO.StreamReader] vs. Get-Content
Comments