diff --git a/Chronometer/Classes/MonitoredScript.ps1 b/Chronometer/Classes/MonitoredScript.ps1 index e85acf6..7228073 100644 --- a/Chronometer/Classes/MonitoredScript.ps1 +++ b/Chronometer/Classes/MonitoredScript.ps1 @@ -6,37 +6,45 @@ class MonitoredScript hidden $lastNode = $null hidden $lastRecord = $null - [float]$ExecutionTime = 0 + [timespan]$ExecutionTime = [timespan]::Zero [int]$LinesOfCode = 0 MonitoredScript() { - $this.Line =New-Object 'System.Collections.Generic.List[ScriptLine]' + $this.Line = New-Object 'System.Collections.Generic.List[ScriptLine]' } [int] SetScript([string]$Path) { - Get-Content -Path $Path | %{ $this.Line.Add( [ScriptLine]@{text=$_;path=$path})} + $lineNumber = 0 + foreach($command in ( Get-Content -Path $Path )) + { + $this.Line.Add( [ScriptLine]::New($command, $path, $lineNumber) ) + $lineNumber++ + } $this.LinesOfCode = $this.Line.Count return $this.LinesOfCode } - [void] AddExecution([hashtable]$node) + [void] AddExecution( [hashtable]$node ) { # Line numbers start at 1 but the array starts at 0 $lineNumber = $node.Breakpoint.Line - 1 $record = $this.Line[$lineNumber] - $record.LineNumber = $lineNumber + $record.AddExecution($node) + + # Calclate the delta in time if($this.lastNode) { - $duration = $node.ElapsedMilliseconds - $this.lastNode.ElapsedMilliseconds + $duration = $node.Elapsed - $this.lastNode.Elapsed } else { - $duration = $node.ElapsedMilliseconds + $duration = $node.Elapsed } + # The delta is how long the last command ran if($this.lastRecord) { $this.lastRecord.AddExecutionTime($duration) @@ -50,32 +58,35 @@ class MonitoredScript [void] PostProcessing() { $this.lastNode = $null - $this.ExecutionTime = 0 + $this.ExecutionTime = [TimeSpan]::Zero foreach($node in $this.line) { $command = $node.text -replace '\s','' switch -Regex ($command) { - '^}$|^}#|^$' { + '^}$|^}#|^$' + { if($node.HitCount -eq 0) { $node.HitCount = $this.lastNode.HitCount } - $node.Milliseconds = 0 + $node.Duration = [TimeSpan]::Zero $node.Average = 0 $this.lastNode = $node } - '^{$|^{#}' { - $node.Milliseconds = 0 + '^{$|^{#}' + { + $node.Duration = [TimeSpan]::Zero $node.Average = 0 $this.lastNode = $node } - default { + default + { $this.lastNode = $node } } - $this.ExecutionTime += $node.Milliseconds + $this.ExecutionTime += $node.Duration } } } \ No newline at end of file diff --git a/Chronometer/Classes/ScriptLine.ps1 b/Chronometer/Classes/ScriptLine.ps1 index 2fd3ece..dab7635 100644 --- a/Chronometer/Classes/ScriptLine.ps1 +++ b/Chronometer/Classes/ScriptLine.ps1 @@ -1,37 +1,68 @@ class ScriptLine { - [float] $Milliseconds = 0 + [TimeSpan] $Duration = 0 [float] $HitCount = 0 - [float] $Min = [float]::MaxValue - [float] $Max = [float]::MinValue + [TimeSpan] $Min = [TimeSpan]::MaxValue + [TimeSpan] $Max = [TimeSpan]::MinValue [float] $Average = 0 [int] $LineNumber [string] $Path [string] $Text + [System.Collections.ArrayList]$Executions + hidden [hashtable]$LastNode = @{} - - [void]AddExecutionTime([float]$Milliseconds) + ScriptLine() { - $this.Milliseconds += $Milliseconds + $this.Executions = New-Object 'System.Collections.ArrayList' + } + + ScriptLine($Command, $Path, $LineNumber) + { + $this.Executions = New-Object 'System.Collections.ArrayList' + $this.Text = $Command + $this.Path = $Path + $this.LineNumber = $LineNumber + } + + + [void]AddExecutionTime([timespan]$Duration) + { + $this.LastNode.Duration = $Duration + $this.Duration += $Duration $this.HitCount += 1 - $this.Average = $this.Milliseconds / $this.HitCount + $this.Average = $this.Duration.Milliseconds / $this.HitCount - if($Milliseconds -lt $this.Min) + if($Duration -lt $this.Min) { - $this.Min = $Milliseconds + $this.Min = $Duration } - if($Milliseconds -gt $this.Max) + if($Duration -gt $this.Max) { - $this.Max = $Milliseconds + $this.Max = $Duration } } + [void] AddExecution([hashtable]$node) + { + $this.Executions.Add($node) + $this.LastNode = $node + } + + [void] Clear() + { + $this.Duration = [timespan]::Zero + $this.HitCount = 0 + $this.Average = 0 + $this.LastNode = $null + $this.Executions.Clear() + } + [string] ToString() { $values = @( - $this.Milliseconds + $this.Duration.Milliseconds $this.HitCount $this.Average $this.LineNumber diff --git a/Chronometer/Classes/ScriptProfiler.ps1 b/Chronometer/Classes/ScriptProfiler.ps1 index 7f6821e..5f600fc 100644 --- a/Chronometer/Classes/ScriptProfiler.ps1 +++ b/Chronometer/Classes/ScriptProfiler.ps1 @@ -13,7 +13,7 @@ class ScriptProfiler { { [ScriptProfiler]::Queue.Enqueue(@{ Breakpoint = $InputObject - ElapsedMilliseconds = [ScriptProfiler]::Timer.ElapsedMilliseconds + Elapsed = [ScriptProfiler]::Timer.Elapsed }) } } diff --git a/Chronometer/chronometer.psd1 b/Chronometer/chronometer.psd1 index 7993982..4a71a60 100644 --- a/Chronometer/chronometer.psd1 +++ b/Chronometer/chronometer.psd1 @@ -8,7 +8,7 @@ RootModule = 'chronometer.psm1' # Version number of this module. -ModuleVersion = '0.4.1' +ModuleVersion = '0.5.0' # ID used to uniquely identify this module GUID = 'f3719c3c-008a-4b25-b94d-fc9f587f62dd'