Last active
February 8, 2017 21:52
-
-
Save guitarrapc/e092ffb40e06fec40216 to your computer and use it in GitHub Desktop.
PowerShell 5.0 using namespace syntax for .NET Operation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Require -Version 5.0 | |
# PowerShell 5.0 now supports <using namespace NameSpace> sysntax like C#! | |
using namespace System; | |
using namespace System.Text; | |
using namespace System.Diagnostics; | |
using namespace System.Linq; | |
using namespace System.Collections.Generic; | |
class NameSpaceSyntaxTest | |
{ | |
# you can not use using namespace for Class output type. | |
# [List[int]] Main() # unable to find type List[int] | |
static [System.Collections.Generic.List[int]] Main() | |
{ | |
# Stopswatch | |
$sw = [Stopwatch]::StartNew(); | |
# List<int> | |
$oldStyleListDeclare = New-Object "System.Collections.Generic.List[int]"; | |
$newStyleListDeclare = New-Object List[int]; | |
# Add item to List<int> | |
[Enumerable]::Range(0,10) ` | |
| % { | |
[Console]::WriteLine("Adding list $_. Elapsed time $($sw.Elapsed.TotalMilliseconds)ms"); | |
$newStyleListDeclare.Add($_); | |
}; | |
# show final message | |
$sw.Stop(); | |
[Console]::WriteLine("Final elapsed time $($sw.Elapsed.TotalMilliseconds)ms"); | |
# Return List result | |
return $newStyleListDeclare; | |
} | |
} | |
[NameSpaceSyntaxTest]::Main(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#Require -Version 5.0 | |
# PowerShell 5.0 now supports <using namespace NameSpace> sysntax like C#! | |
using namespace System; | |
using namespace System.Text; | |
using namespace System.Diagnostics; | |
using namespace System.Linq; | |
using namespace System.Collections.Generic; | |
function Main | |
{ | |
[OutputType([System.Collections.Generic.List[int]])] | |
[CmdletBinding()] | |
param() | |
# Stopswatch | |
$sw = [Stopwatch]::StartNew(); | |
# List<int> | |
$oldStyleListDeclare = New-Object "System.Collections.Generic.List[int]"; | |
$newStyleListDeclare = New-Object List[int]; | |
# Add item to List<int> | |
[Enumerable]::Range(0,10) ` | |
| % { | |
[Console]::WriteLine("Adding list $_. Elapsed time $($sw.Elapsed.TotalMilliseconds)ms"); | |
$newStyleListDeclare.Add($_); | |
}; | |
# show final message | |
$sw.Stop(); | |
[Console]::WriteLine("Final elapsed time $($sw.Elapsed.TotalMilliseconds)ms"); | |
# show List result | |
return $newStyleListDeclare; | |
} | |
Main; |
FWIW 99% of time you measure is spent in internal PowerShell stuff which is not affected by class/function difference in optimization: Linq.Range, pipeline intrinsics, scriptbock context creation, console function invocation, console output itself.
The code below is 100+ times faster as compared to the original one on i7 CPU:
$time = foreach ($_ in 0..9) {
"Adding list $_. Elapsed time $($sw.Elapsed.TotalMilliseconds)ms"
$newStyleListDeclare.Add($_) >$null
}
$sw.Stop()
[Console]::WriteLine($time -join "`n")
Adding list 0. Elapsed time 0.0178ms
Adding list 1. Elapsed time 0.0281ms
Adding list 2. Elapsed time 0.0307ms
Adding list 3. Elapsed time 0.0331ms
Adding list 4. Elapsed time 0.0351ms
Adding list 5. Elapsed time 0.0375ms
Adding list 6. Elapsed time 0.0395ms
Adding list 7. Elapsed time 0.0416ms
Adding list 8. Elapsed time 0.0436ms
Adding list 9. Elapsed time 0.0466ms
Final elapsed time 0.0524ms
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Function Result